2019第十届蓝桥杯B组决赛题解第九题 i, _8 E% D; P8 C! l0 a
/ g" g% ]1 L/ }" N) `
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
0 S, N3 G6 I0 b: l/ ~每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
t/ D2 Z3 g" d: i, ^3 E/ `& l0 G查询的时候返回含有8个值得list,并不断merge 代码:
* F7 |0 k7 l7 B& _#include<bits/stdc++.h> S1 I5 g, c9 D/ D! v4 a% \
#define mem(a,b) memset(a,b,sizeof(a))
& j3 Q5 v2 }% W7 L* Y- lusing namespace std;7 |$ ? \" M) f' V0 {4 `: u
typedef long long ll;
- T3 m6 v# {$ S% uconst int inf = 0x3f3f3f3f;
) q0 A- b9 r7 x$ w' a- L" p' C( ^+ k: wconst int maxn = 1e5+55555;
9 X+ Y% H Y" V% R+ \const ll mod = 998244353;
8 H' R0 O7 n4 G0 Sconst double eps = 1e-7;
3 w8 R" D" U4 U# b8 G7 l- b& z; h1 Z' {6 C! u
struct tree {) S3 H' a- z" o
int l,r;
6 H5 c. h; Z, J r7 [ int p[10];
% R0 v! N7 S8 j. j) @6 |} t[maxn<<2];9 P9 |* K( T9 [5 P# G8 E
& T+ G! {8 q% K0 p4 a2 R: t: e
int l,n;# v3 e% I1 T* B4 A, j
7 E5 x1 E1 ]$ k4 T; o8 Y+ [
void build(int i,int l,int r) {
- l' D2 S$ l0 q& s& v2 f+ k* d5 k; l t.l = l;
# O6 z' u7 h5 b- c l/ R t.r = r;
' }; h$ M, I8 n2 f7 B+ _' e mem(t.p,0);
) d6 R3 B8 m4 E; a5 m! U
0 G: v. I/ B8 r, S( } if(l == r) return ;
- f7 S! z" _# U X4 J int mid = (l+r)>>1;7 }( s2 [! U L& C+ O
build(i<<1,l,mid);
! V$ F6 A* C. |3 G& } build(i<<1|1,mid+1,r);
# w! w1 L; d1 q return ;
3 J" `6 p( M- e+ C: i# ~}, t+ U% v8 z6 p, u/ @7 G7 {# ]
- V7 h( F# i* b- \/ Evoid update(int i) {
% L5 y# m# D. F+ n int cnt1 = 0,cnt2 = 0;
4 Y$ R+ r. S5 P for(int j = 0;j< 8;j++) {" v# @& _: T" q* ~6 Y& Y
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {& _& t% V7 Y# A5 d% F
t.p[j] = t[i<<1].p[cnt1];8 j3 D8 X Q2 r0 t
cnt1++;) y% l' z; E& q( S V
} else {$ R( B* A# L' L0 n7 [' y& A8 s
t.p[j] = t[i<<1|1].p[cnt2];
5 r# r2 k- i/ W" V# d: m! W4 Z cnt2++;& Y- ~: i+ b' ^ {
}% M6 J/ r; o5 `( K7 ?% {! \
}
& K( y' G* v! b+ X, ~, m+ Z9 d s return ;
1 O- d5 H4 v; W( m}
" t) |% K( J o+ D: X" R# ` ?7 B
void modify(int i,int pos,int val) {4 ^: ]4 z# \2 I3 _; K9 }2 b/ h! @
if(t.l> pos || t.r< pos) return ;, ^$ g6 N/ U& K1 o, n
if(t.l == t.r) {- p; F/ I1 `! y
t.p[0] = val;
1 V) U1 u3 F7 H4 i! Q! P return ;' R1 b6 Q; F% |" J' z" M L
}
8 x- y7 r& X6 }: z modify(i<<1,pos,val);
( F. w1 H. ?5 B) a- |. C4 s& @ modify(i<<1|1,pos,val);2 n" X0 d, P6 r: }
update(i);. [# J8 J6 o/ ~8 A3 N
return ;
; }2 e5 l6 p: a& H/ c1 v}
/ A2 t) R, V- A& M8 `5 q, g3 Y
9 u, z2 N: l) o! Ovector<int> merge(vector<int> ans1,vector<int> ans2) {! H" i4 a8 C5 N, ]" ?
vector<int> ans;8 b' `: [" o) l
int cnt1 = 0,cnt2 = 0;, g2 Q, {) J/ Z5 Z- ~9 q' O
for(int j = 0;j< 8;j++) {, l7 W) g# L8 N
if(ans1[cnt1]> ans2[cnt2]) {" s0 V# r2 @/ l; _* x
ans.push_back(ans1[cnt1]);
6 M/ Q' A' C: e' u5 d- f cnt1++;
" L4 D, j3 l9 G7 ~% y } else {
4 k: ~7 s+ i( E' s ans.push_back(ans2[cnt2]);
1 ]- G, c% S* E8 D2 V cnt2++;0 F% E; f1 \/ n9 } }3 |
}
j: K0 l/ l e% y; P }
, `: V! w) o/ s7 g3 b return ans;
6 o* E3 A$ X) J} |" F9 r) A/ V1 G
( i8 F. H& l9 i3 `
vector<int> query(int i,int l,int r) {1 z5 N! @7 @4 j6 G( |& g
vector<int> ans; b$ B# X7 g& ^/ V! p4 _
if(t.l> r||t.r< l) {, ^* D' j! ?7 i3 c
for(int j = 0;j< 8;j++) ans.push_back(0);
3 {" S( I! w# L3 D3 Y return ans;! |# Y0 r1 I5 b. s# Q8 c! v' L
}
5 b) ~4 ]' H6 |9 v N& @" l" u! S3 ?) t6 h. ^; K
if(t.l>= l&&t.r<= r) {
$ k3 A4 X; g8 Z/ D for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
( J7 b; W# r+ i Y% l2 E0 Y1 c" u return ans;- b i+ h+ m+ s+ R7 S0 ?) p& B. ~" S
}% E* \0 P6 k3 A9 X
) V8 ^7 y3 b3 P) \2 B G7 O return merge(query(i<<1,l,r),query(i<<1|1,l,r));0 F& I8 p: `( k1 ^
}
7 l1 w+ |0 W0 Y% [ w, I7 x
9 ~( g, a0 i; y2 O8 Iint main() {( A4 F6 R; ~( O \" N7 n- u
cin>>l>>n;
4 i& S4 l7 a) s. C5 m v t; N5 ]# D. N5 b
build(1,1,l);
' u1 I$ a4 z" _" ~" w) k char c;
" U, R2 b- L( C* v- `4 ^: W9 X int x,y;
3 W0 ?7 ]" K' \1 Y* \ while(n--) {
7 m' }% {) `, U) P3 \" s( v# t scanf(" %c %d %d",&c,&x,&y);
9 A8 V1 v1 h% t3 R if(c == 'C') {
6 \0 f$ Z; D5 J" p modify(1,x,y);
" a7 c: Q: i. ~5 W: N } else {8 s' O& c- D# {9 v
if(y-x+1< 8) {9 ]* [& p N: n# e3 A
printf("0\n");
1 N% P. W3 V }7 {( a continue;5 M! _- L3 E& O4 C5 j
}" d4 c0 n8 R3 z0 S* @0 e- g5 Y
vector<int> ans = query(1,x,y);. s9 s' }: c: ~' }/ o) r
printf("%d\n",ans[7]);
2 j; l' y7 h) j }4 a H0 O0 c1 v" h
}: ~) s" P( B& \ f
0 ^1 a4 w$ H- ^/ w1 D9 D+ m+ e
return 0;8 {2 b" f/ ]. ]9 s( b1 `
}1 c9 k( c( r2 e' T2 A
* n- N5 a3 L0 S--------------------- ' b# e& C8 z0 m3 E) ~; q/ V6 H
作者:nka_kun 0 E8 n1 D% y* U; b7 Q- m' F+ [
来源:CSDN * L, A; j* K5 y1 @# t- e/ e, J7 b
$ t6 Q( [1 q _4 G1 G0 S
: ? p, m% x" |" I f5 e
# w/ M1 d% \6 L; @ |