2019第十届蓝桥杯B组决赛题解第九题, S0 c3 ~. S) A" q3 v
1 f9 w9 h7 E5 g( |) |% y
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)2 O8 c* [$ p. `0 J) U! w
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
+ }# |! X$ w$ S+ [- ?) d查询的时候返回含有8个值得list,并不断merge 代码: ) A* r/ ^- M' Q$ g
#include<bits/stdc++.h>
+ M' m" ]. ?& {2 ?9 M#define mem(a,b) memset(a,b,sizeof(a))
2 C& a2 T0 I* R/ E+ ^2 L& F nusing namespace std;
, s# e! M: x* R) c( a$ Htypedef long long ll;; I4 Q5 R9 ~: r9 k! T2 A
const int inf = 0x3f3f3f3f;7 N; b6 E% q) s) T7 M8 y+ R
const int maxn = 1e5+55555;% X0 R5 _5 E a# X- C! t
const ll mod = 998244353;
) \& n! p& C) |: ^0 Z! X- econst double eps = 1e-7;5 _* X' w# U! z6 T! V* n/ H
1 d/ v Y. U' s# W! @; d* e. i2 mstruct tree {4 d8 U' \2 l0 G
int l,r;
' J @. e! g7 q+ I# Z0 m2 q int p[10];- C* ^. b, q' ~
} t[maxn<<2];
, R A7 X0 K% m, I/ D5 y: Z: ^" P( o4 T2 E) ]
int l,n;: K- B9 j2 C0 s" M* z5 e0 B+ o
) }6 ?4 H3 o3 }9 Q6 n& V
void build(int i,int l,int r) {1 U% l. L5 \+ U) i
t.l = l;- `, g+ c8 \2 D l. l
t.r = r;% F) U. A9 D/ A7 J
mem(t.p,0);4 X( c4 d q7 V7 b! r" G2 L: T
$ x; b5 b/ ]8 ~# x3 J if(l == r) return ;% v5 F: `# f# Y: ~
int mid = (l+r)>>1;
+ U! {) j6 g4 V, H1 U build(i<<1,l,mid);* s, D* }8 b( v+ P& M2 h2 h
build(i<<1|1,mid+1,r);0 m3 q) F4 S0 m1 f' y
return ;1 K1 I" C5 V& O' w
}
- W q( V9 P; @) F
6 Y, a2 F0 f6 A/ Jvoid update(int i) {% y2 {( N! u, R9 ?/ s( J) ~
int cnt1 = 0,cnt2 = 0;
4 m) |6 Q+ g9 y: z for(int j = 0;j< 8;j++) {8 D: \8 d4 [( f" s6 x0 B4 a
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {' ^3 Q, D! `& g+ P6 L+ f" z& P
t.p[j] = t[i<<1].p[cnt1];
4 ?4 R8 M' f- G- O cnt1++;
9 e$ u6 K0 E% [% Z" |1 ^* A g) M } else {
! y) j% Z' |2 Z. T4 ^ t.p[j] = t[i<<1|1].p[cnt2];
* c( |& T% i" m$ e cnt2++;7 C5 Q: c) e) @$ T
}
! M( y0 g% w' o) N }
0 |6 ~; W& K: z/ T! ~3 N- E return ;
, i9 V0 d9 `7 e4 x( F% M+ F5 S}
/ c* H: c/ t H# r4 e+ z8 S% O9 I. {; t0 w3 ]' o1 h) N
void modify(int i,int pos,int val) {
" m5 I |* }9 \+ c b if(t.l> pos || t.r< pos) return ;; b1 J$ k" {$ y S X A+ u
if(t.l == t.r) {
- V! F5 N) d! V t.p[0] = val;9 }+ o2 X; u6 l) L& r
return ;
1 s" M8 \+ a2 H, P+ ?& O }
. p! q( ?$ L- J# ]# Q- e6 |6 k modify(i<<1,pos,val);
. T" o' t. V% S3 M* g Z5 F modify(i<<1|1,pos,val);
. u! z' o& x/ B update(i);0 P( T0 G) x1 V* ]) ?- |
return ;
f: }: e* e1 ^$ P4 v3 t0 u- z}
- S8 F1 n% u% n6 C
) r6 K1 A. B- ]9 A0 H* {( xvector<int> merge(vector<int> ans1,vector<int> ans2) {
* c4 R" H3 a+ l C; M6 Z. O8 a( k vector<int> ans;
, G. H' S3 r/ v" W0 f9 g, z int cnt1 = 0,cnt2 = 0;
- d$ h- u4 a/ X, m' X7 g for(int j = 0;j< 8;j++) {* O) { \# o$ V% t
if(ans1[cnt1]> ans2[cnt2]) {
) a5 e4 [4 j/ x3 g ans.push_back(ans1[cnt1]);
& Y! ]6 Q. P7 m8 |7 {; x* I8 q cnt1++;
- r) {) U% E/ _ n" n9 Q B! P0 r } else {
2 Q+ K1 |) Y/ a1 V; m3 t ans.push_back(ans2[cnt2]);
! O! \" M4 \# D% n& k: r3 X+ y cnt2++;
" J( {/ e+ p- d6 r* S7 ? }
/ l, c% e- M; Y3 ?, _- t0 [5 C }
* |9 `3 [# J0 [! D/ P+ k" z+ H return ans;
* T( O/ z; k) T# Z}; s+ m6 T# D1 w7 w D0 L( V
5 s( s- W' B, d& Bvector<int> query(int i,int l,int r) {
# K- C* L u# F0 @ vector<int> ans;
# `6 c( @# B' ^ if(t.l> r||t.r< l) {
7 g! f! T) [: z. f& ~ for(int j = 0;j< 8;j++) ans.push_back(0);
9 i5 G: f* d" ?8 _% t! I1 \ return ans;5 D+ O. [6 C2 B8 z; G+ E6 O
}1 X6 q8 a7 v4 R( \
! J# f3 i; |+ @" Z if(t.l>= l&&t.r<= r) {5 n" d2 _' B# r0 | g" [ h
for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
( ]: v M# f6 R3 t! U return ans;
& V9 i- g" Q7 e/ b% O8 v+ c; g, e }
. B. s3 f2 |5 y, Z' A& z
' w' ~ Y5 O5 e$ ^3 I return merge(query(i<<1,l,r),query(i<<1|1,l,r));/ E. ]* E9 s& ]3 k0 P6 b2 H5 V
}
q9 B: _! u: ?5 f1 E- [1 O! @7 e# G- G3 m% W( v# Y
int main() {
% b% m/ O1 _2 H( X3 v4 M cin>>l>>n;, h- P9 m* C Q" |
" T$ L' e9 N- O) I7 Y
build(1,1,l);1 X! a, n5 P) O: n2 A9 S% I0 u
char c;
3 ?8 M$ O+ [% N& m' }& M int x,y;* \8 V% z: o& ]6 T2 L: k
while(n--) {0 w6 t: u: ]1 C& F
scanf(" %c %d %d",&c,&x,&y);
7 O. ]& {0 ^ _ if(c == 'C') {: A: a9 r. @- S
modify(1,x,y);
% u5 P4 T$ N2 X5 |) A } else {, D8 b# h% ` d: Y' T9 g" u
if(y-x+1< 8) {; {: ]- U$ j! c$ @/ X
printf("0\n");/ _. J& @3 H9 f; g: v
continue;
- n: a/ M; n' a% h+ N) m }% }" z; N$ H4 @4 ^! g8 F
vector<int> ans = query(1,x,y);( v$ y! D1 k. i1 _3 R$ G
printf("%d\n",ans[7]);
( N+ R8 X2 U- B9 u+ e }
; t; {9 B* _4 G$ K" N: @# L }: w k! ~$ L+ {7 ^/ ?
" U1 _6 J& L6 D1 j0 e& n% _. o' I w return 0;: s2 y/ ~) d$ P, Q- B+ o6 e( d
}9 L, z5 o1 E0 J. w# z% c# U
0 J! \5 |" t" w! k---------------------
( H6 d3 F+ h7 ~作者:nka_kun
/ @/ l- j: Y; h& _来源:CSDN 0 G# ~, C* m& u7 [. ~" p. F0 X
* M+ K C/ a ~8 U3 X
6 j& b, ^* p8 E* H
5 J8 Y6 X- Q* Y: u |