2019第十届蓝桥杯B组决赛题解第九题
5 y9 p+ T& c& O. u% C% V% s
K- n7 f* M; o" l. B题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)/ G' n1 s4 c$ Q
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8- ^) J9 v' E3 ~8 G, ^
查询的时候返回含有8个值得list,并不断merge 代码:
) s9 I" h% }8 i( D5 x+ X$ f#include<bits/stdc++.h>
& {* C: c: j- y#define mem(a,b) memset(a,b,sizeof(a)): d1 c7 t% K7 U% R n( H" K
using namespace std;
- c7 i& X. y y3 `" u- l4 c atypedef long long ll;
3 c) Z5 d3 w8 Vconst int inf = 0x3f3f3f3f;' i1 ?+ F9 B) ? L
const int maxn = 1e5+55555;# k0 w$ J+ F) e% A* ?9 G+ }+ r
const ll mod = 998244353;+ T! l r& ]8 W: a8 u' R( `
const double eps = 1e-7;
$ d/ v' W7 P j0 i2 \! ?
4 A7 y( R: @6 a& X% }struct tree {2 t. |1 W- M D- R- B4 n7 [0 i
int l,r;
! }( {. y& n% ` int p[10];
, F) q2 m! t! D4 {1 \} t[maxn<<2];6 H* x, g+ }0 _ ?" c
y) A5 W1 U2 {' _8 B0 R
int l,n;9 }3 j" Z& T3 f& E
$ k# L, c0 e1 ?& ?- Gvoid build(int i,int l,int r) {% _* I( s& x) H) H+ ?! q
t.l = l;% Q) X; b' m+ @6 `; F" I
t.r = r;" s0 u, S4 W3 q
mem(t.p,0);
3 @# w3 @; b* J' a) N/ i( j8 I# q, D$ ~- a) ?" L% c! k
if(l == r) return ;1 @$ C' p: p- j) V& m3 d) Y& p' W
int mid = (l+r)>>1;8 K; x+ \; U$ L5 p9 T. ?
build(i<<1,l,mid);) {% s j; F. C3 D k& B
build(i<<1|1,mid+1,r);0 V3 P* @2 n4 \! y
return ;
9 w; t, @) k" V, R. _0 S}# {* }1 D" ]2 A4 V1 d: }( ^
% b1 w9 T" R: Bvoid update(int i) {
2 Z# N* y+ c, }3 _4 W: N. K int cnt1 = 0,cnt2 = 0;6 k- | Q) f. }5 w2 Z# P9 V, V
for(int j = 0;j< 8;j++) {
, Z8 K! [9 R! j! b( w8 Z h3 T6 O if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {5 }; I) Y0 |9 \6 v# [9 E7 O
t.p[j] = t[i<<1].p[cnt1];
n/ ?1 ]4 ^, Y; J9 O9 k/ w( `% o cnt1++;. F) N- L1 q- H/ h( Y: w4 p% w3 Z0 _
} else {4 r/ _" V! C2 B7 X
t.p[j] = t[i<<1|1].p[cnt2];0 p0 \( r0 Z* w0 I, Z5 ]! t
cnt2++;
' @3 f* I: N; r1 O }
0 @% C! B1 i" ~. Z8 a. c$ F }/ j4 O& X% |+ n+ U
return ;* K3 p E! C" D( I. L
}
# p Q& K; v0 ]# p. L" T& V& X: G1 `+ S% s
void modify(int i,int pos,int val) {+ t8 _3 J3 p& G1 Z5 z5 Z
if(t.l> pos || t.r< pos) return ;9 _1 {9 Z+ X/ n
if(t.l == t.r) {
+ Y7 b5 i, }- A. ?' P6 P5 g$ ] t.p[0] = val;
! h8 f2 J* ^4 K, x1 ?# C7 c0 T return ;: ]: c+ M2 D& r/ }7 z% n
}
" X9 |& J2 n; p' H- @ modify(i<<1,pos,val);, h, I+ ~* e3 t7 g. Q8 J4 O- B
modify(i<<1|1,pos,val);/ g& c9 c9 v# o1 Y* m
update(i);
4 b. g; t6 I5 ?1 G& {- a" v return ;0 U3 m& U! I4 E; b, d; t& `
}
: e) }" i) h2 Y; p& A/ I8 w$ p! Y+ N) U" ~" s
vector<int> merge(vector<int> ans1,vector<int> ans2) {0 I8 g: J- ?, U: ]8 q4 X$ c
vector<int> ans;
$ c$ B8 x0 w: `, m int cnt1 = 0,cnt2 = 0;
0 O' _5 _, r) y. e: v! W$ T for(int j = 0;j< 8;j++) {% Q# E) A4 v$ n0 X. F0 M& U- T- x6 ^
if(ans1[cnt1]> ans2[cnt2]) {
# Y% D7 l! n5 S& n0 n ans.push_back(ans1[cnt1]);$ |7 m! p) D/ s% r
cnt1++;
5 m( H& H, P. ~ } else {
0 e+ J: Q. q5 e3 S( ^% p2 G+ g ans.push_back(ans2[cnt2]);$ F2 g1 Y7 A! `: m7 W% p6 Q8 ^
cnt2++;" ]4 M. l/ p2 u; d
}
% \! ^! g" p9 {# o. q5 E }
1 D# i& T1 [. o* H/ B; s return ans;
) z9 U2 Y% J% \2 o4 M5 u+ T' ~( V}
, ~6 n$ `# W! c/ w$ w s, }
, R- Y$ P, v0 I0 b; b- y, G6 o- ^0 [vector<int> query(int i,int l,int r) {
) N( L/ N6 a6 s3 C9 W vector<int> ans;8 W5 O% z3 y( C$ f
if(t.l> r||t.r< l) {) V( w3 M: U* s9 k
for(int j = 0;j< 8;j++) ans.push_back(0);1 h: E/ G$ B1 |- o' P7 G( A- m
return ans;! w' k' k9 [, G5 T, g% A, e! N" F
}
5 M# g! U. H* U0 C M* R3 B. t. x+ V6 d' W* m
if(t.l>= l&&t.r<= r) {
) w- Q/ R: M2 Z/ W% I for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
+ ?3 o) C- y0 i2 c+ V6 G( m return ans;
' P, @# i5 [3 Z; a/ t9 X! ^ }5 i. d# T* e4 x8 B& J1 R! H( H
! f# K6 y7 a% _. c+ U return merge(query(i<<1,l,r),query(i<<1|1,l,r));: b! L% T/ ]# s' z
}) J/ x% T. J3 X" N, O# A$ \
9 G3 r6 k* p, k' _6 i/ B! B* eint main() {
2 D w" i1 o5 j7 o/ L; L( R" T( f cin>>l>>n;" x* e* b- r4 a7 b# F6 u
# u6 R. |& H; H% ^$ h# I8 \ build(1,1,l);
* y, N! T+ @. D char c;
9 B" R8 J/ L3 r2 A$ ?% i, E int x,y;, Z8 o$ b6 B8 ~ Z0 A
while(n--) {( c8 u0 c- g' ^( }$ K
scanf(" %c %d %d",&c,&x,&y);! Y0 m7 ?. }/ p* b% U* |( E* Q
if(c == 'C') {
' p. U4 \5 t6 x3 E* q! j: l& c* B( @ modify(1,x,y);
& P: j, b5 {0 I4 L2 j3 A" g } else {0 r9 n0 s7 R/ C N( M
if(y-x+1< 8) {+ `5 z/ W; I/ {5 u5 \! \+ Y
printf("0\n");
, _8 M" \, `* D2 f continue;' S' H0 b, h6 k
}! g- ]3 {4 R3 o2 g7 h( o+ Z
vector<int> ans = query(1,x,y);
: ?: [# b4 H3 s" t; O' j/ Z' ^ printf("%d\n",ans[7]);
% h5 E5 F7 u- P; c* m7 ?, K) Y }
5 d+ f4 i& q/ F" O* p }
) {- ]/ S7 h4 v2 `7 a) l2 o1 P$ S: t' t; _! j8 x& M }" X$ U
return 0;
4 L0 j+ F, }( R% w}! h; p9 m4 V3 i/ u; `" b6 m
7 V! H! [. u! Q+ j( R1 T--------------------- . f- A! Z' q- X) Z0 D8 X
作者:nka_kun
! g3 n: a2 ` l2 \+ K7 v* \来源:CSDN / s7 r9 T8 M- K
I' F7 d6 C+ A( x+ N+ ~: y% R( y3 Y( @
. F4 P) X. ]3 y% Q* \
|