2019第十届蓝桥杯B组决赛题解第九题
" }$ Z( T8 }- y7 H
/ _; N3 e/ q, E/ v7 y4 I题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)5 q) B& i* Y0 O8 b* s/ E, @' O& }
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
( q1 ] N. n( F k查询的时候返回含有8个值得list,并不断merge 代码:
0 f. {( h5 t3 t8 W e6 d7 n- _#include<bits/stdc++.h>6 O1 d' ]. r1 q3 u0 S6 w0 y% S/ X5 F
#define mem(a,b) memset(a,b,sizeof(a))
( \+ L* L# b6 H- u1 I& Tusing namespace std;
0 g( b5 Z6 o% c# n. Atypedef long long ll; Q" J: U }7 r6 g m
const int inf = 0x3f3f3f3f;
+ E8 t2 [" T( A1 L% x+ U9 Kconst int maxn = 1e5+55555;
! [0 ?# C3 }/ v1 J- O: r; Bconst ll mod = 998244353;" e b& Y# B$ c- z
const double eps = 1e-7;) t8 l# p* q+ q
1 X+ q5 y4 l Dstruct tree {6 w, t. d% J2 q: n5 m0 y
int l,r;
* Z9 e6 R: l9 | int p[10];2 [* `. s$ t7 Y3 x, Z% w8 X
} t[maxn<<2];. E- `+ F2 `2 r8 d; Q/ \3 O
0 D. m- T' Z4 Y+ r- n6 m9 m/ lint l,n;
8 W7 d& @6 u! Z, `4 G
g. }& x( U) Wvoid build(int i,int l,int r) {6 K$ A9 U/ w6 Y4 r, B( |
t.l = l;- a8 e: }. C; x, s! Q; e: F% m; E* r- E
t.r = r;
2 }4 p5 q4 C3 R: q. N. | mem(t.p,0);2 v6 w9 S. o% i1 p j) u1 z, O
9 ^! Q- H1 e% z) S# R9 l( c
if(l == r) return ;
/ S$ ^7 \' F+ M2 |+ Q* j! w E int mid = (l+r)>>1;
2 b. `5 S3 b" w0 `- k build(i<<1,l,mid);& L% i+ d. a( G4 t+ l5 f4 R
build(i<<1|1,mid+1,r);. ]. q' y$ ~; l0 e0 \, j
return ;
9 W q. G! d( v- k}
: s% t0 d# U9 d# B0 B* ] ^6 a( g/ C2 h+ B/ k5 e
void update(int i) {9 E" ^8 g& I/ d1 g
int cnt1 = 0,cnt2 = 0;
! P, ]. p* L1 s& @) p9 q for(int j = 0;j< 8;j++) {9 j4 k: L, l9 _2 K9 w$ n$ P8 f
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {/ t% R0 `( ]6 g' p# Q8 @4 R' r" F
t.p[j] = t[i<<1].p[cnt1];
& `. p* q0 f3 B4 u9 @& g9 u cnt1++;
' y2 J+ G A0 L: e) C) i' C6 M } else {
5 e' Q; r' a' M, r t.p[j] = t[i<<1|1].p[cnt2];% R0 e. [5 m; b1 Z, Z
cnt2++;# \; t5 J# m$ C0 x
}
' F3 x+ l% s8 G }9 h3 ~+ m+ i* V2 s/ J
return ;! d. O; A d8 s( }% e1 D1 e
}
& k7 g( g1 i% o3 D
4 d: Q2 b) v0 avoid modify(int i,int pos,int val) {
+ K# l$ U5 D1 V* A4 k) U if(t.l> pos || t.r< pos) return ;
8 T; j ~& E8 s* X$ E if(t.l == t.r) {9 N4 `% {- _' U4 G! c) {0 Q7 d# i* D
t.p[0] = val;
& `7 z4 Z# }0 I. M return ;8 U1 H6 @: `0 }& D" F
}4 f: E& L8 G2 V6 h* C
modify(i<<1,pos,val);
2 o9 S: h% _- s9 z9 i" n. v; N modify(i<<1|1,pos,val);7 f. v8 N! ?6 y4 w) _
update(i);
' E3 ?% b- t3 I2 } return ;
) }0 g/ Y5 y, F- n5 r}
/ l/ x% C/ k1 j0 A; j# ~" o9 u3 i: H" O! I$ `% e
vector<int> merge(vector<int> ans1,vector<int> ans2) {- n* J* z% `8 M/ Z( C8 K
vector<int> ans;. z- C5 T [. ^9 T/ T7 ?; X
int cnt1 = 0,cnt2 = 0;
0 E ^( N7 Q/ L8 E$ t$ J& X for(int j = 0;j< 8;j++) {( I2 E; t/ ]1 f2 j; j
if(ans1[cnt1]> ans2[cnt2]) {4 @) O. ~% q: _5 d
ans.push_back(ans1[cnt1]);
. k6 ~2 x c s9 V cnt1++;2 C2 A7 X* I( T1 G$ i4 J0 W
} else {+ s# \% x1 c& R: `% m4 s3 r
ans.push_back(ans2[cnt2]);
! t2 Q+ l; c1 Q9 R2 m cnt2++; q! m/ q; V- G
}
) S+ Q+ m; R7 H {5 Y }; O3 c# {# y# }4 { X- h$ ?4 `
return ans;
# Y& a C& _8 H6 f k}
8 H6 |8 c; j% }" w8 w
; N; `* }5 e2 C1 Nvector<int> query(int i,int l,int r) {
$ g& j; Q0 [" C' y9 \' @ vector<int> ans;
9 \' u5 p* G& p2 t- a8 L$ e if(t.l> r||t.r< l) {
3 e: @3 y) Z4 A. N! T for(int j = 0;j< 8;j++) ans.push_back(0);) z7 V, f1 ` R8 `
return ans;
% G, Q& S% s( k4 @( E5 ?6 E0 |6 ~ }" |6 H) u, }: Q# i0 c
* D" P S" F' A! ^( @$ t# _0 z
if(t.l>= l&&t.r<= r) {
8 I& _6 n* B3 l C" q ]& n. j for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
! I% C# x# N& {$ m: n) e return ans;, V4 c! z$ l( e; O6 ~( z
}2 o. ^$ i5 U2 f" k( r/ o
/ J4 L1 {# @. q$ R1 x" u
return merge(query(i<<1,l,r),query(i<<1|1,l,r));
3 \1 ?3 Z" F0 ?3 X}
8 Q& S3 k. y, g- f4 o( @ L
9 R. ~0 l9 \' v/ ]% Hint main() {
9 J2 Q* F, K0 g6 R4 Z0 t e cin>>l>>n;
- L! A. d/ r, r* }
/ \! F# R$ J) O# o build(1,1,l);
5 o- F1 h, L: z! A2 `6 [" o2 R char c;
7 |5 n+ \( \* \/ Q' }9 x- x S4 t int x,y;
: L: f% g) h: d) M8 Y5 {5 ` while(n--) {
! T1 A5 L% Y1 ~. i scanf(" %c %d %d",&c,&x,&y);5 O( y2 {& M$ A z, n9 u6 }; q
if(c == 'C') {
4 j( y: S$ J& s; ?% m6 l) Y modify(1,x,y);
+ f/ w& b& v9 X/ a( L } else {, a; j' K* j1 @9 B
if(y-x+1< 8) {% P K. v! O$ z4 h$ ^0 |& G
printf("0\n");# Z; v, V# R5 C. m9 l' b# }. H
continue;! f5 M% ]" l0 v: a I8 V( s
}6 f0 z- D& F2 j; l1 t
vector<int> ans = query(1,x,y);5 v9 R# P7 y0 s3 K3 g7 s
printf("%d\n",ans[7]);! T9 @3 {( V( t/ I2 d4 u5 I
}
* C& M; h# ]$ F3 h" T* d0 d8 {! H }7 ~* f' G+ N5 u3 @3 B
3 C( r: d& c! Z+ x" K5 [+ G6 w
return 0;
* e5 o+ s' k' a}
( S+ B$ O" |+ l; \2 J* D! J5 a2 |3 A) Q+ d' r) n( J i3 x
---------------------
* j! S8 h$ ]4 o, r9 W& k/ F作者:nka_kun
1 y. y! V: p6 }) ?来源:CSDN + S, I2 ?& m; ?% a- d
5 w% y- o4 c9 U1 W% x* }* i8 e
" C3 F- g; d3 i% ]' I* h2 ^9 F& ], Z, \0 i( `0 M
|