2019第十届蓝桥杯B组决赛题解第九题
; m" S0 n0 m1 _7 g: `7 z5 V6 x
. t% z. z5 e' Q$ J题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
v3 I. `* a- E5 y5 @每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
. M F; F9 c2 @0 F" ?* j$ U查询的时候返回含有8个值得list,并不断merge 代码: 0 E5 L6 F6 e4 m3 r% M
#include<bits/stdc++.h># g" D( D X X0 S
#define mem(a,b) memset(a,b,sizeof(a))6 i9 m; q8 u& }9 u! W7 I6 d( v
using namespace std;
. c; j: L' [0 v" z3 ntypedef long long ll;
$ ~1 U: {8 C0 ^ q/ \, _const int inf = 0x3f3f3f3f;. R3 V& W" F4 X e( e' V
const int maxn = 1e5+55555;5 C4 j( ]2 ]5 ]7 i0 k8 q; l
const ll mod = 998244353;
+ V$ @1 A, y9 c3 a; ?7 @const double eps = 1e-7; X9 o( x; s. n- W. |
2 w/ i6 X: H1 J2 q- i
struct tree {
4 _& f/ B% |2 q5 f% q4 Q int l,r;
; D9 Y: X& C Y4 j int p[10];
& [5 j/ r' v/ W} t[maxn<<2];
: T1 `4 B* `- ^ U" h* a7 y7 k4 m4 I* ^& x
int l,n;
' \1 \1 b! }& G0 g, ]' Q
! Q, {. B; v1 k! }/ U$ mvoid build(int i,int l,int r) {
# V+ v, c8 _. Z) [2 g6 O5 H$ p' V t.l = l;/ h: S8 K+ R3 ?" S% {" {
t.r = r;
( p& ^! t l! |, \! q- r( s4 T- d7 I mem(t.p,0);: y+ H0 D9 d- y+ D
) {; K4 L9 l7 B" ?$ w s% C. h if(l == r) return ;7 m1 B2 w, v3 Z3 b: s
int mid = (l+r)>>1;
; H0 F* T# ^! M) D3 _6 s8 q( L( ? build(i<<1,l,mid);
" p0 ^: g4 N. _0 a7 n build(i<<1|1,mid+1,r);% ~% ^ S/ ~$ ~' p
return ;
0 Q4 n6 H9 e' x! h, b( F}
5 V! f$ P' v9 ^3 p. Z4 M5 J
7 C) }% X' p/ t; C5 E+ Q( Q& {- e/ Rvoid update(int i) {. n2 W& T, w6 |6 A6 S4 N
int cnt1 = 0,cnt2 = 0;; k8 p, V; \* b: A8 w# |: k4 t
for(int j = 0;j< 8;j++) {
4 C3 u g( u# |- m, n if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {6 Z% J' g1 g9 Y. @( c
t.p[j] = t[i<<1].p[cnt1];6 c* ]7 O7 O/ R! c4 Q; P- S
cnt1++;
8 I/ L c$ Y, ~" e# Z( n. b } else {% k3 b- }6 H, y8 z' M2 U
t.p[j] = t[i<<1|1].p[cnt2];/ S2 E( G( h! f6 ]
cnt2++;4 x. G3 Y" h4 a, u6 u& M
}5 f4 Z! H& L+ q8 [
}
# Z* Q/ x9 K& B* ~/ Z0 G return ;' p* v5 a: X- u' ~1 @1 e
}: u5 x/ u5 i G1 o: m
5 W4 \9 Z+ `1 gvoid modify(int i,int pos,int val) {
# B3 a) s# Y' p if(t.l> pos || t.r< pos) return ;4 R) _! P! s K/ M" J; _5 o5 U' B
if(t.l == t.r) {
5 D0 c/ y, E: ]% n$ `9 m$ m t.p[0] = val;
" n! y$ c, A9 k return ;. }# D( O& x0 B
}, W7 A$ L n; b
modify(i<<1,pos,val);
0 N4 H5 i& q) g4 P7 l! B) m" X modify(i<<1|1,pos,val);
0 u( h3 u3 h: ]6 [" L3 T0 b update(i); u4 w+ @4 H9 ?& l. P* u, l
return ;3 a* j u4 O: u; C/ T1 ^
}
9 h M" q6 V$ H# ~0 A% M: t, `$ S1 k9 j* _% r" w$ u+ a. r
vector<int> merge(vector<int> ans1,vector<int> ans2) {
: }; ?9 w4 x& p( o3 g% n: d vector<int> ans;$ P% v/ L/ {, |, c7 q- J; G
int cnt1 = 0,cnt2 = 0;
+ x9 t% }( P0 C& ~2 k- e for(int j = 0;j< 8;j++) {
, B0 L, f. n# ?; \7 Z4 _ if(ans1[cnt1]> ans2[cnt2]) {
, {, [0 X, \' P% R: x) W. O ans.push_back(ans1[cnt1]);# E7 u( [5 _8 q1 w4 ^! I
cnt1++;
" n% z! b3 P+ Q# U4 j } else {
! u; T, }$ i* _, k ans.push_back(ans2[cnt2]);
( Y. |1 d2 P6 O cnt2++;
, L% e0 E# N" V, ], s. d }. C% p3 i0 L/ B4 u
}
6 s5 M3 L# l3 i; K6 E7 e return ans;0 s0 Q0 } I3 E8 G- }( t
}
3 ^6 r- j. w" J) W% R) @: r9 v" |( U4 w
vector<int> query(int i,int l,int r) {/ K J4 g" f* `" ]9 f
vector<int> ans;. p7 D1 k p7 v' t; _
if(t.l> r||t.r< l) {
- F. q# m2 B) X+ w4 P1 T for(int j = 0;j< 8;j++) ans.push_back(0);
* X4 M/ w3 T# k$ O6 D& F! E2 O return ans;
( Z& W$ | z( G N" r0 h }
) r1 f" W- m t/ z0 R( Y% F3 P: m( p7 |; c$ u1 [" b
if(t.l>= l&&t.r<= r) {$ u: ]' i( X* d8 V" A% D! ]5 r+ \( ]
for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
( Y9 J* z; V3 t! T7 t3 [ return ans;* i+ I. S. v/ |- }
}! E# O% n, x! ]7 c$ |7 b: `: k/ d2 n
% \' i" P4 ^- u1 b8 y: N
return merge(query(i<<1,l,r),query(i<<1|1,l,r));! x4 g0 x4 P9 |9 ^2 D3 z9 Y
}
! z; W, {9 q: o0 V1 z
c7 W1 T7 G( l3 g/ Mint main() {4 O) E0 X8 C2 l T5 U
cin>>l>>n;' K; Q, }% u3 H3 Z+ }/ f# Q3 v
* s; q _" B* r8 M5 n9 g
build(1,1,l);
9 f& J* ^9 E" q- ?. X$ R char c;
, V! T/ a; A& B1 v int x,y;) ], D4 c8 Q$ ?3 @
while(n--) {) N; ^: p* P$ F- `( v1 q1 d
scanf(" %c %d %d",&c,&x,&y);4 J: X r2 S- c1 L
if(c == 'C') {
! O! ]# y) [0 @$ B: U% S modify(1,x,y);
$ @3 ?/ ]; Z' }5 X" R k! @5 F } else {
- b) X3 E9 h) ~. N# c( s. ^ if(y-x+1< 8) {
2 N5 y' s( f6 k) M# {& Y printf("0\n");
: o: |6 a# g4 W continue;
2 b6 U [# n' {1 l }$ \3 L8 @! W [+ o S
vector<int> ans = query(1,x,y);
1 }/ `* @& P% @' v- T6 ~ printf("%d\n",ans[7]);
: ?$ l% @+ Z( h, i% A( N: C }5 z6 A9 ^$ u, I
}
* ]. }) D7 ?: t( R5 m
6 | @+ R7 I8 _& Z. R return 0;
5 M. V' b% P" C9 w& u( R}. X5 E; k+ N: }9 c0 @: q
( j7 P; n4 t. Q6 M! `---------------------
) d( I+ p8 w9 T1 A+ P作者:nka_kun ! |+ u' |9 I" m8 ^4 G* Z
来源:CSDN ^6 c8 t' v* `& N- }
- d+ n$ n! ?6 d% R7 X! k& @8 I/ b5 e% C9 O) m( _0 Y
& q% O- j: e& h3 P& I |