2019第十届蓝桥杯B组决赛题解第九题
& g; a/ F5 x9 X( F. Y0 a( `8 j# P# I& r. ~8 h, G# _
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)" M) Q6 G# ], z/ ^$ ^5 t
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8; {9 E, {) J d8 P* L# k+ m
查询的时候返回含有8个值得list,并不断merge 代码:
0 v/ v6 g# |/ W#include<bits/stdc++.h>$ `8 G% a+ ^9 v- j3 v5 i
#define mem(a,b) memset(a,b,sizeof(a))
3 d% T+ y1 b1 {1 X, K+ x& Pusing namespace std;8 u& m: k F' Y: g
typedef long long ll;7 T! f C) f% }& O
const int inf = 0x3f3f3f3f;
: I% u' D9 W4 X8 j6 ^const int maxn = 1e5+55555;
8 T4 X, j6 i j3 I3 W! F# ]const ll mod = 998244353;% B4 a+ O% N5 y1 |
const double eps = 1e-7;
; p+ x _0 s0 A! e; r: {) O; i; |) h' z; D
struct tree {
/ b' u: W( H) Q9 n% F) _ int l,r;5 N* K. A5 c$ M( q% \
int p[10];# [+ a3 ^7 Y" g; S( W! Y
} t[maxn<<2];5 F" z8 }) @" W. ]0 p2 a
. Y' o/ F$ H4 Tint l,n;
% E2 Y; J4 a) Q0 N1 Y* y0 c; m. @/ c, T5 b4 ?4 Y6 `
void build(int i,int l,int r) {, G6 H, c D1 J2 |/ {4 b& I' G! d; U
t.l = l;" u9 f3 B% |; o1 H" {) d! b
t.r = r;
. O2 v3 x' f/ u mem(t.p,0);
9 r$ i, L, P7 Q O, \3 h! v2 w' ^) |, \5 u
if(l == r) return ;% J+ f# v- e3 @$ B
int mid = (l+r)>>1;
. B( E& ?, D( e5 b8 {! D- O) K8 ~& J build(i<<1,l,mid);; z6 c1 m: ~- Q4 o5 B
build(i<<1|1,mid+1,r);
+ v4 m! x6 K5 T" a7 Y) ? return ;
. M3 k2 u# r' e% a}
/ V5 O: f% O; z6 ~% u, Q! \- v) b8 b! ^* |7 y, ~
void update(int i) {* w8 j$ [5 }1 U; @6 ^& z& V
int cnt1 = 0,cnt2 = 0;
! M) K b2 V( X& l for(int j = 0;j< 8;j++) {
& k0 V; U9 a0 H! W if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
0 [& I$ @. f8 H P0 ? t.p[j] = t[i<<1].p[cnt1];
! A4 n, H* `) o9 J, [6 d5 \' } cnt1++;! Y$ w5 Z8 ]+ I( h E# O& @
} else {
0 \) K- Z( H0 D% g0 Z t.p[j] = t[i<<1|1].p[cnt2];0 _8 V4 ]7 n/ G7 {6 W' [: C) x
cnt2++;- M$ C2 D. `6 w4 X: W: q
}
! x" |; X8 j# t- M }
8 i) S+ _5 C7 h- K; O return ;
: h( l, v0 R# X. y8 B( D- A}
7 z) g" j; a% V& @) K$ u1 k$ j! l+ l
" Q& I p g) G& U$ qvoid modify(int i,int pos,int val) {
2 S( E1 C& G, g: [ if(t.l> pos || t.r< pos) return ;/ v% e* G9 q/ T2 Z& n
if(t.l == t.r) {
A) r' i6 ]' c t.p[0] = val;! D; ^, b8 @- o8 U$ P& u1 l( s
return ;
, ]$ ]4 h/ v F3 {8 Y4 r8 C }' T8 A/ R( C( P z1 K7 g5 T
modify(i<<1,pos,val);* L1 j6 H) ^1 |% \3 t% k) W" W
modify(i<<1|1,pos,val);. x1 }$ s) @4 o) M
update(i);1 _# _9 p% m# j2 ~5 G- K
return ;
- Z9 [( [+ N9 d5 i( N, y4 z' B+ f}
- v* u' L% O/ Q; k V
/ [0 q8 {" B# X5 Pvector<int> merge(vector<int> ans1,vector<int> ans2) {" Z- h4 ?& R" J" T
vector<int> ans;
' K; c6 x+ e; z7 H! N$ I& Z int cnt1 = 0,cnt2 = 0;, g1 v3 s) L9 b
for(int j = 0;j< 8;j++) {
- ~$ {0 J1 l6 h+ Q' i% k if(ans1[cnt1]> ans2[cnt2]) {5 }" u0 k- \2 c% R9 Q
ans.push_back(ans1[cnt1]);' X* f, p9 S4 K. H
cnt1++;
: t2 A+ t( x7 P) u, Y8 D } else {+ L+ \9 I7 t, s& N% X# _
ans.push_back(ans2[cnt2]);8 \, q7 Q9 k, ^
cnt2++;# J+ B9 w- W4 s- _
}: w8 ~8 d) V" h2 Z) ~
}
1 `& G& ^, a0 l& h3 `2 x return ans;
. O+ q. A7 ~ W. s3 N& I9 }* A0 ]}- R5 M4 Q% F* K% U6 C
1 D/ i! `4 r4 _9 ~* Y7 I
vector<int> query(int i,int l,int r) {
' c( S2 y8 h; e f! ?& `- W vector<int> ans;7 s0 A1 O. m/ T5 ?) `6 G
if(t.l> r||t.r< l) {
/ ^" \' {# r4 _9 s7 i6 m for(int j = 0;j< 8;j++) ans.push_back(0);' V& h& a" I: m3 q; D3 \
return ans;
+ F1 d V/ `* Q9 x' @ }; j O2 z3 D5 Q0 o8 x) g# I8 y9 R
8 ?( K) i' t: k# n6 P
if(t.l>= l&&t.r<= r) {
" R' f- e) z7 i8 V for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
& \( q# s; r: K$ D ~) m, T5 J$ G1 J7 ` return ans;
3 [; D% b" N& e+ D3 d/ @9 l }
, S: p t1 _- j' J, C- X9 B
" x$ s z. W" ?* n6 U7 m3 p, ~ return merge(query(i<<1,l,r),query(i<<1|1,l,r));3 A5 l( W8 N0 ^# B- j+ g7 m
}. K" g5 c% H q- B3 Q
9 i* V9 c. K2 s- cint main() {7 L6 |( c* s7 {% Z. O/ o
cin>>l>>n;( u; G! y% `. o5 b1 F
. k( n" G9 n: ~$ O# l, i
build(1,1,l);
9 u: E* N$ b* S' O* [& w! }1 c3 G+ H% j char c;3 R1 H4 T$ R' X! H& C3 N4 z
int x,y;
( W% o" g* `, ~ while(n--) {8 x9 W. {6 |! ~5 ^8 W" T
scanf(" %c %d %d",&c,&x,&y);3 A; y' M$ ?5 J& Z+ \* C9 p5 P- Q
if(c == 'C') {
; L/ w: D3 b8 q modify(1,x,y);+ r( c6 g5 X3 Q6 X( b2 Q
} else {. }: l4 {/ n2 n. w- D( e& N
if(y-x+1< 8) {
. s' o, i* l( i printf("0\n");
5 a) g$ R* C& x+ J continue;# m! O/ O6 ]7 e1 o% x2 }8 Q
}
. y1 v& @) H; ~7 n) b1 K: M vector<int> ans = query(1,x,y);' b& G2 l- G5 x* L* w/ d+ n# ^
printf("%d\n",ans[7]);
1 d1 `* K" j0 [) { }
. m2 C6 I1 }. n- p }; o/ |, i4 s, E4 Y
2 R! e5 n ]1 `( A. k" ~* V) g return 0;5 f6 L. _+ L1 o
}! b1 p+ q. z6 b3 l6 n. ] m M
8 B7 Y" A, A7 b& g
---------------------
* ?( \' |: |& c; N9 o( `* t1 G作者:nka_kun
& N3 T+ v1 }# ?8 D* H Y. b. D来源:CSDN
3 F7 @1 f- A! W% _5 ?( e
6 o- Q/ ?1 ]* q8 U0 G# n: [2 k* T" E% Y
4 v/ m5 Q5 z. ^5 } \0 F- V |