2019第十届蓝桥杯B组决赛题解第九题# O; @; B. i% i
: N) z7 J5 k5 f& ^( l. Y0 L9 z1 k
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)6 t: U d0 d! K: a, Y$ t
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8# A! k% I; ^7 p: ]1 w! j& ?
查询的时候返回含有8个值得list,并不断merge 代码:
) u8 w" d+ Y5 e#include<bits/stdc++.h>
' o; f& P$ _8 Q+ `& n& L#define mem(a,b) memset(a,b,sizeof(a))
0 O% F8 n. Z4 Qusing namespace std;
: T1 S! T) m' ktypedef long long ll;
: A" d7 N2 b8 `( fconst int inf = 0x3f3f3f3f;
* Y( `, j; {; {: M* l) ]8 ~1 nconst int maxn = 1e5+55555;
2 n2 N3 |. L4 I* M7 ?const ll mod = 998244353;9 T$ g6 B0 a9 @+ v
const double eps = 1e-7;8 [- j0 G& k8 ?9 m5 [' u
$ z" p" @& [) t t0 d- pstruct tree {
9 ]. ?3 R/ b/ @5 G) R; m int l,r;7 L3 K ?5 q. D% \
int p[10];5 J+ `3 Y; A( Y9 X6 i2 f
} t[maxn<<2];; o, x( _) c# i
3 b# u: z9 Y& T" a: |( B
int l,n;% o- o% U: [1 t/ e5 Y
2 s" _5 I+ A) z! ]5 f8 N% g3 |# `
void build(int i,int l,int r) {
3 X9 a/ g6 C2 [9 b1 F t.l = l;
1 h' O6 V& }. v8 q' L t.r = r;) [8 r* ~/ s* m C/ J! M3 r
mem(t.p,0);1 Z, S3 v0 q6 Z; o5 t( {+ N( D8 ?
3 S/ P5 E( M3 W' v6 e2 _0 ~# X
if(l == r) return ;- F: L3 B: C5 z7 L) W" ]# N
int mid = (l+r)>>1;
) P6 c s E1 \3 Z$ V build(i<<1,l,mid);
. {4 x1 A) P7 K8 e# s# |2 | B1 ] c0 m build(i<<1|1,mid+1,r);+ c0 e( \8 ?7 d8 m7 X
return ;
) B' }2 A) y# a6 {1 Q1 k}# R3 B3 F# {8 N' o' x! _- f5 G
( t8 W4 U( C2 q* d# f
void update(int i) {
$ g; M5 u. R; V. ^9 z int cnt1 = 0,cnt2 = 0;# j# S8 w4 J" @! W" s
for(int j = 0;j< 8;j++) { L7 t z s( |9 ~0 K! {2 M
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
& W( Y' _ [6 R t.p[j] = t[i<<1].p[cnt1];
0 o& V; E0 F0 K- ^ cnt1++;. ?! m% R& j* E3 e% T& {
} else {$ A6 u7 }: s- b7 m- T
t.p[j] = t[i<<1|1].p[cnt2];: O' [1 A0 | A) M, J
cnt2++;
: _& k3 ~: B9 D( } U' g }
& R- V! j2 k, G+ f) v0 W. a }
' q, R- J" v& E% Q) L3 X8 K return ;
+ i( _8 T' m8 U3 ]4 r$ _}. Q( F0 K4 P% t& g1 J
. q0 h6 a- ^% L# W8 a O, \3 j
void modify(int i,int pos,int val) {
4 W! u+ ^' f) P% I if(t.l> pos || t.r< pos) return ;
2 U0 f. c: v8 M { if(t.l == t.r) { {+ b0 Y; m+ R; L6 T
t.p[0] = val;
2 R( V- D2 ~$ }. d/ b* K. m# K return ;
; ^" Z+ ~7 _& R3 t5 s }
6 X" {6 {4 d( R, H6 u, t* ` modify(i<<1,pos,val);3 Y: J( @( U; ?9 w; e9 M+ {
modify(i<<1|1,pos,val);
) g8 C& s7 M- a V3 @( d# P: q; S update(i);* _( G5 U! E9 o7 @5 Y- F7 N
return ;
% E2 q' K& z! \$ m- y}
$ R$ T# `2 ]# r) i5 o/ J
1 g" v) }2 W. d* M2 y' z0 ]vector<int> merge(vector<int> ans1,vector<int> ans2) {
% `% K+ m% d$ U" b! M+ J vector<int> ans;$ K1 ~2 d U8 y6 B) T9 [ ^
int cnt1 = 0,cnt2 = 0;
) s1 h1 h- N* G% D for(int j = 0;j< 8;j++) {4 r; k5 o9 k% L
if(ans1[cnt1]> ans2[cnt2]) {
% h. K- X$ F5 E, c& X2 |7 o0 [ ans.push_back(ans1[cnt1]);
; u4 O2 X9 U# P* x2 ~ cnt1++;: I. C; S* Z/ E5 ~: C! j/ v$ G% s$ k
} else {5 Q X& e) x2 k+ _) S+ x/ i
ans.push_back(ans2[cnt2]);0 r, e0 N9 y9 N, O& ?3 n' f
cnt2++;
9 R& j; s8 U v# o- }4 S }
% J) \" a2 E! l2 Z }
$ U- U9 J- p6 G' s return ans;; U3 ]0 [' ~" F L6 g4 R3 c& |
}
2 w# b9 F0 F6 H2 X8 K& z9 K+ [! z9 L* w5 M
vector<int> query(int i,int l,int r) {/ b2 ?# X* q) f! R/ c* U, W, e
vector<int> ans;
! j" b: g7 Q* E if(t.l> r||t.r< l) {
2 z4 [7 }" h! V! S/ e( Z for(int j = 0;j< 8;j++) ans.push_back(0);
, |) x+ U- b" v$ _, {+ B return ans;: {- u! a3 g$ f
}
$ Y- j& T5 t; j; W4 ]) {6 Y: C/ J5 b, r* a! N, u
if(t.l>= l&&t.r<= r) {
# c% V3 Q ~5 D9 Z for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);0 \( X' O; a) m
return ans;
0 X& C3 e9 X$ W' l! Q" U: h* l }
5 K; t( [) ^+ ?, ~; I% P$ D( [
4 t1 R% o- t4 h* r return merge(query(i<<1,l,r),query(i<<1|1,l,r));
- Q4 v' O" B3 F! L; V}
2 ^# o. A0 V3 w" u! G' v
* d5 j6 G, P# l# e( }' ~int main() { v9 F0 G* A/ N1 |1 F" m* x
cin>>l>>n;
+ V! e6 g" u7 ^5 _' A! z) d. F8 Y7 g" H
build(1,1,l);; j7 L3 [( z+ o8 P5 b
char c;; B* x8 _0 k* T+ b0 c5 ]
int x,y;1 ?" [) ^& Q* _6 l( ]
while(n--) {+ O0 ^1 w& z8 R5 C3 x# R/ n
scanf(" %c %d %d",&c,&x,&y);
' W7 d) d- I1 [! p; M if(c == 'C') {
% q& T3 ^( f$ ^+ A modify(1,x,y);. r0 o% B( d o7 @$ ~- Y
} else {
0 \1 U! B h+ u5 \# C! _ if(y-x+1< 8) {+ |# e* S) G7 u j3 y2 m0 Z
printf("0\n");
/ Q Q7 L! G5 g$ U. s6 I' H continue;& y+ c+ D! _7 P# G
}
+ H+ x/ \* m1 g& W# ^& M$ ^ vector<int> ans = query(1,x,y);
6 E+ a0 N2 ^( e5 Q8 L8 \ printf("%d\n",ans[7]); C( k: [* r) K' }2 V* M* V$ y
}
/ K. k' u- [! q* ~. H }- ^/ k% r! @: z/ d; r: q
4 s! t1 s7 T) Z( \* M; N9 c
return 0;
9 B- W' p: }7 d# o}
8 @& p4 D; R7 w n# Q8 C0 o3 {. Q& g7 |' B. t
--------------------- ( `9 c( ]" _7 l4 U* X# E0 E A
作者:nka_kun 4 e% ] B: k R6 \3 U: S! d7 a; ~
来源:CSDN " Z6 X+ e0 `$ M" u' ]
- D$ V x2 j/ B: j3 y0 A; A% e4 `+ Y
) u4 O v2 {7 b+ F8 B |