2019第十届蓝桥杯B组决赛题解第九题
; a! {7 Q; q! l7 g4 Q+ e
+ l. R5 Q5 O$ w& }: H* Q题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
. m& z( H% w3 i$ e ]每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
) v% @. |( S' K& S6 J- u查询的时候返回含有8个值得list,并不断merge 代码: , [6 x9 H9 V8 v( c$ g
#include<bits/stdc++.h>. j; k- S* w& m0 N+ J' b: P* T
#define mem(a,b) memset(a,b,sizeof(a))! _1 J! W2 g4 a9 _5 v- V
using namespace std;, U/ Z5 m+ e3 B9 Y1 e* y
typedef long long ll;: T$ ^: J) k( y. ^) V1 h4 P2 G8 S
const int inf = 0x3f3f3f3f;
$ b3 v+ m/ ?' W0 ]; Pconst int maxn = 1e5+55555;
( J# `0 X6 U0 m0 I# e- Aconst ll mod = 998244353;
, W8 p5 S" ?% M2 U1 V9 bconst double eps = 1e-7; |) O9 O m& ^! Z
6 H1 H4 p7 p0 w& \" \& D& T: p N" ~struct tree {
q) F4 @& r# O int l,r;3 F" ?( w# d& Y: B3 l& a S+ `7 `
int p[10];& }2 A0 J# y* d9 ?; X
} t[maxn<<2];
/ w$ W6 ^4 U ^4 @" R' M1 l& T3 B" [0 }. J9 s
int l,n;7 z& V, J& ~* D8 u0 h# b
3 n# J( G7 ?2 ^1 z" Pvoid build(int i,int l,int r) { i* E$ b7 r: M0 U" {* g
t.l = l;
5 h, b, V' h" z) Q t.r = r;
* k5 h% k$ j9 v+ o: b1 I2 n mem(t.p,0);9 N0 h. b. a# A
! z; i1 T# O* l# u$ \ if(l == r) return ;3 @& p- z5 b+ D+ _- {
int mid = (l+r)>>1;
( x8 B5 y! k/ a4 l build(i<<1,l,mid);9 S5 n c& g i' r
build(i<<1|1,mid+1,r);
2 S% V1 q% m4 a) `3 M return ;' w) Q) M% S1 w( {2 f$ n, O
}
2 W. o* R% n6 y$ ^3 ?4 C6 I1 ?+ e. H' q! H. O' q
void update(int i) {: s8 X1 D0 _- R' {! L0 p
int cnt1 = 0,cnt2 = 0;- K0 k% x/ j, m9 l
for(int j = 0;j< 8;j++) {1 O/ H2 g- m! ]0 h
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
# S. f' ^1 F, s& _: r5 F+ r& @. b t.p[j] = t[i<<1].p[cnt1];( X9 t5 Q M. V: }' `2 f
cnt1++;; ?9 `9 B, W5 |. I
} else {
; O9 u" L* z P& C t.p[j] = t[i<<1|1].p[cnt2];3 y& n' a/ a) \; _% _, B
cnt2++;' t; |4 W2 }1 V l5 Z; f
}) S/ D+ ~4 a% o+ |
}
) G. X, W. T4 q return ;2 p6 B: [3 z; Q/ u
}( `: v) {' P& |. x' r- c
( ^+ @, U2 G S# Jvoid modify(int i,int pos,int val) {( v- f1 f. j7 ?. k C. P2 K
if(t.l> pos || t.r< pos) return ;/ r$ R$ Z% u( U t
if(t.l == t.r) {
) W L/ c P& \) d t.p[0] = val;
4 H$ k9 C- y2 Q, L. ^( A return ;5 C- {- N% S2 ]
}
8 i0 f( I- H: g/ y( o% U _7 u, M modify(i<<1,pos,val);' `5 _- ^+ I |* s* j
modify(i<<1|1,pos,val);
+ `# Y7 }( b3 L2 g& n! ?% p$ O update(i);
0 d4 W6 n: b( ]8 x) t return ;6 n! E; ?1 o& N
} m, N+ L- j# @$ a. U
4 a# K* F8 u# h0 ~. Svector<int> merge(vector<int> ans1,vector<int> ans2) {: o' f0 ^4 w' [4 Y# u
vector<int> ans;
1 |6 d7 B2 f- n2 V' r3 p$ L int cnt1 = 0,cnt2 = 0;# ~7 P0 ]* y, Y' P0 k/ t
for(int j = 0;j< 8;j++) {
1 m0 o0 s; E1 H- ~0 z if(ans1[cnt1]> ans2[cnt2]) {
* h B _% _5 p+ s$ g5 N ans.push_back(ans1[cnt1]);* p$ `' P- t) ]- X- ?: ?8 Z) x
cnt1++;4 Y1 Q6 y; o& ?$ L; g
} else {
; `3 x6 o7 g$ [( m ans.push_back(ans2[cnt2]);
% S; y$ }: {1 G4 v cnt2++;
- `; C4 b1 D+ d } S2 ?: Q9 I5 h9 |! |
}4 [; T- F- w$ Q8 P( m* f
return ans;
3 W+ v2 r6 d3 b+ @4 P}
# `; l4 S& f! j- g; [- q: b# ~8 y+ p0 E5 U& m- A" ]8 }$ y+ i# l
vector<int> query(int i,int l,int r) {1 ]0 s' z+ \2 e) R6 K
vector<int> ans;* I0 M5 T" ~: |2 L: _- A
if(t.l> r||t.r< l) {$ s, n0 N& ` S) s2 ~
for(int j = 0;j< 8;j++) ans.push_back(0);
) F; @9 |0 s, U% I+ D% ?0 ?, `& D return ans;
9 u0 z: Q' c4 A4 L9 t% g6 @ }2 h3 d* l8 H! J% R4 J' X
" Z. p' H5 d6 p- v! N# d if(t.l>= l&&t.r<= r) {
$ k% T) G0 }0 l; J4 z- F5 U for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);& ?$ o0 h8 Z* q. K$ h$ r1 W
return ans;6 o7 i1 L2 [3 \2 g! H% `
}6 |6 ]# ?8 f+ X2 a+ }5 r4 t
) h7 r! O7 U8 m/ i/ H% @
return merge(query(i<<1,l,r),query(i<<1|1,l,r));
: }; h0 V3 u' L& b! P" T}
+ i+ w/ y' Y4 D+ ~8 e& x
G: B+ `9 S. d& ?, X* H& A" i$ dint main() {
$ k# f" {9 w# f/ y b# M6 `, j$ ^ cin>>l>>n;$ o6 k% _$ a0 ]- v8 y- }" o, z' \
- e# V) z( n- }- x6 M3 h6 m build(1,1,l);
0 b* z& R, C- l' g( U# @( j char c;6 w7 w% H9 |8 [, e! [
int x,y;
8 p/ `$ Z, {+ `6 S while(n--) {9 M: C# |" u+ I" i5 B
scanf(" %c %d %d",&c,&x,&y);
* w' @9 n1 V' V if(c == 'C') {/ O$ y# X3 w. R' k/ ~" u
modify(1,x,y);
. v. A; K) W3 {- H M+ U0 A2 N9 V } else {
8 `/ w- X. C# C if(y-x+1< 8) {; y% ^+ {* n. K5 f0 _
printf("0\n");/ t% r% W0 ^$ Z. {2 p* l6 S8 E
continue;
( w2 J9 d& v$ V+ w. \ }* l+ ^7 q* @. i6 z! c) Q
vector<int> ans = query(1,x,y);# e$ P1 }# l+ U; i5 p
printf("%d\n",ans[7]);
8 d2 m+ n# j% X3 `/ `' I }
; [6 ?6 N+ m. K4 C8 @ }- T" ` z2 M8 N
# l3 B$ k0 z k5 Z5 a( v
return 0;
' y2 z8 f: H, q- X}
$ h5 Y1 l6 o' y8 i/ ]0 B6 r5 }3 V7 y7 q# A
---------------------
/ y1 ]* m }) j9 [( D作者:nka_kun : E1 b8 D6 M. W( \* J9 R) y8 l' D
来源:CSDN - H" {2 q3 N7 r* ^( Q
/ v8 D9 B" d% P5 W: L1 I* R! Z2 Q0 B) U
: c1 `: m5 h6 f; l" v |