2019第十届蓝桥杯B组决赛题解第九题! `2 v8 o. j' b/ J3 h: U4 }! Q" b
( ~0 l. Q0 v( N8 t
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
& H- Y8 p3 U0 A; G每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
7 l; M; A x n查询的时候返回含有8个值得list,并不断merge 代码:
- W; H' [4 b5 o#include<bits/stdc++.h>
9 x: h9 j) p( e" p" D, @#define mem(a,b) memset(a,b,sizeof(a))
2 p. [' W% s% kusing namespace std;
, ~; x9 J' g' ^" W' utypedef long long ll;
1 o1 I3 }5 I# T4 o' Mconst int inf = 0x3f3f3f3f;
5 z+ W1 C& k9 n3 c3 k8 X4 _const int maxn = 1e5+55555;6 g i" a8 u9 V7 d
const ll mod = 998244353;6 ~. I" ~" L9 b8 X" i% ~) {
const double eps = 1e-7;
/ @# r* p6 c2 G0 l. P0 [8 j: \
2 M# g# T3 `9 J/ c7 j4 p5 U& E. Vstruct tree {
( n1 s7 s4 G3 c int l,r;
6 L& m1 g; z7 [ int p[10];
3 _7 N2 E# V1 x} t[maxn<<2];
8 S: b. E& a/ N. G# [" c7 K- Z" N
int l,n;0 x$ O* V' h$ T( U
$ ?8 @: s- d$ x* r. q5 H" u
void build(int i,int l,int r) {
) _4 i6 O+ s1 h0 ^ @- f# I! u1 J t.l = l;
6 S+ n. E( q# S5 L5 g0 O { t.r = r;
% f: L7 r+ |$ l# ]3 K, j mem(t.p,0);+ n* [, @+ i; _% N
' @9 ~8 I5 r" g/ {
if(l == r) return ;# p" I! T+ W# d' _# m+ ]
int mid = (l+r)>>1;! Z7 b. T0 j/ s! [) Q0 d0 _
build(i<<1,l,mid);
5 d9 p7 i& w- t3 r. x2 i3 y build(i<<1|1,mid+1,r);
c6 I% q/ ^2 f1 n" C8 ~6 ? return ;* w! ?) T5 l' g8 k
}5 S0 N8 k6 a/ e' Q& @4 \# [* w
$ t" [$ ?: G7 i8 [9 F9 Nvoid update(int i) {
; n1 e, z) z8 X4 ?- f/ W' p+ [' t2 o. I int cnt1 = 0,cnt2 = 0;/ d, O* ?5 Y1 u6 ?; Z" v
for(int j = 0;j< 8;j++) {
6 g/ w9 \$ ]3 [' ] if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
& `0 j* U7 F1 a' U4 E- |" |" k t.p[j] = t[i<<1].p[cnt1];
. x, ?: I: U% T4 {0 V cnt1++;2 L7 f( t3 ?+ O1 k; u2 e) B
} else {
* M( t. w" i. h- } t.p[j] = t[i<<1|1].p[cnt2];
' a. N! W# Q% `( ^- R8 B cnt2++;
+ W7 Z+ {3 x- V# N/ g& E }
( ]* p5 k2 L$ C8 b0 v, r4 n }
1 ^* _$ G' o, {" t" \- W: m4 Y% J) ^ return ;
1 p2 I' Q& z& i9 C0 H}4 [8 V, [! B2 g* h- Y
& Q9 S7 O6 V7 I' a" H
void modify(int i,int pos,int val) {4 G0 O" C1 O w1 S9 j* W
if(t.l> pos || t.r< pos) return ;0 i' |4 g5 n5 P
if(t.l == t.r) {
; y. R& @+ b5 @) Z& | t.p[0] = val; }$ a( T% |0 F2 x6 ^
return ;- x6 J0 j* w% l& o. V
}
7 w3 |+ K8 y$ n+ H modify(i<<1,pos,val);* X h9 `9 A- c
modify(i<<1|1,pos,val);
' @& F" v; E6 [' b9 n$ `" m update(i);
. r3 O- Z, U6 U7 ]8 D. t9 Y return ;2 }$ e1 @4 Y, G2 k: i) K
}) ^7 ]. v! f3 O3 V
! {% ]5 V: x8 r- n( N: i1 ^4 o
vector<int> merge(vector<int> ans1,vector<int> ans2) {
+ w' f, ~- X$ }: N/ N0 y vector<int> ans;- v, u& e2 [# K$ W8 L$ _$ X0 O0 H
int cnt1 = 0,cnt2 = 0;5 n$ u: ^' z; b( }+ \5 [ z
for(int j = 0;j< 8;j++) {8 e1 J" v& {2 Q9 @7 d. b' z# J6 `
if(ans1[cnt1]> ans2[cnt2]) {& R, Y) b, a- @/ L: u
ans.push_back(ans1[cnt1]);% P. `( M0 k9 E; V7 l Y8 j3 R
cnt1++;
$ ? @0 {0 m1 x" q* x } else {6 |/ e, h& {4 X8 _, v2 ^: ~
ans.push_back(ans2[cnt2]);3 d- U* m6 T1 Y# {* z
cnt2++;
: L0 v- F; n* W2 `( [1 X% Y5 E }# {7 Y3 V; c$ A8 I V' \# i4 u9 P
}. ?8 _* P- ^, a' x" P, W
return ans;
% W0 I0 k; Q E}
0 A; J6 `2 ^' g9 I
" G% Z8 B& n* M) Evector<int> query(int i,int l,int r) {
5 b5 G$ `5 Q# n1 K vector<int> ans;$ {4 N+ v" T4 u$ p* I, v
if(t.l> r||t.r< l) {) f4 x9 U6 V" n5 H S3 u$ Z u
for(int j = 0;j< 8;j++) ans.push_back(0);
: z' `9 W' ^" W q) ~" Z+ Q* L return ans;+ r5 k. l! p& k' T! x1 }& Q
}
! z4 y! y/ |! U1 r' l/ R$ X6 {! }+ A3 n* B. j
if(t.l>= l&&t.r<= r) {
) P+ L+ q# x9 g* ` for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
# ?' C0 x4 U+ _) d- m( K1 {# d return ans;9 I* J4 U7 ~/ f9 r- W6 _
}
. a2 Z S4 a4 R4 p1 M& w
% j. p/ P- e8 X! k# q return merge(query(i<<1,l,r),query(i<<1|1,l,r));
& U$ G0 Y" ^4 n- w( z' {0 A}: i- i) a6 b: B/ \0 l$ M8 S
+ C) k) V" p2 e/ G1 K5 X- U
int main() {) ?! Z6 [3 p/ x% C
cin>>l>>n; K: Y; h+ @) u9 m8 M
( t* b6 v8 i$ c6 N# g
build(1,1,l);
7 Y, |/ F4 h, T: I# Q+ {& q char c;
5 d9 u& z8 v0 T& L( f! D int x,y;3 d6 m: P2 y! w+ q$ q u9 s
while(n--) {$ y/ b$ P0 @" b# w4 Z
scanf(" %c %d %d",&c,&x,&y);
0 T9 o# d) D/ A# v0 @- _0 X if(c == 'C') {% p' b3 G" }; n D1 {2 Q. Q! s" E
modify(1,x,y);
, m, S( c5 v) s3 \; O; L; Z } else {" Q4 f8 }. d! _" q
if(y-x+1< 8) {/ ?0 p5 y' a4 [. m
printf("0\n");
/ C2 e2 T8 J3 {7 E. Z continue;% K9 ?" Q9 j0 b+ R8 s N. o
}1 I+ c( _* _: _# o& ^$ q8 l
vector<int> ans = query(1,x,y);9 s4 q" X" B& ]& P6 n! w. H( P
printf("%d\n",ans[7]);
# V" r* _/ f; k' q a7 f1 O& U/ X4 A }* ]2 ?$ c8 `( W' Z7 G
}
; \2 x/ x8 p7 P6 Z$ c/ Z/ W5 D; O) G8 n0 v8 l
return 0;
8 \& O$ D Y( o$ @# l}
) C- b' M2 _" b$ E: }4 c4 M3 g+ ]$ \9 a' j8 I" B
--------------------- - ^7 U; u# \. v- a' ^9 t$ G- I
作者:nka_kun
7 f- J2 K( H& {: }5 K来源:CSDN ! y' B0 }. {3 p% Y
$ Q; y6 i% T. U: k% X& K
% [% f0 ` j, V+ W
) `! n$ g$ n) C7 s0 e
|