2019第十届蓝桥杯B组决赛题解第九题( C8 X9 `2 {; J
7 C# p8 Q( `- M+ v# G2 B, `+ \
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
2 R# }# J7 H" O2 t8 m, D$ k每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*86 D8 p' p: r2 [ N! I
查询的时候返回含有8个值得list,并不断merge 代码: - ?1 ]$ q* A" ]
#include<bits/stdc++.h>
+ _# ]: G' l K8 m$ R' z L' K6 [4 g2 j#define mem(a,b) memset(a,b,sizeof(a))
& v% f3 o5 H, E: n/ b; Fusing namespace std;
* H% J8 K# k; v+ f' ~" S! Z0 Htypedef long long ll;
% n# ^+ @- g3 m& I9 S( bconst int inf = 0x3f3f3f3f;1 q+ V* N! L6 V
const int maxn = 1e5+55555;
+ S) v) r! t) uconst ll mod = 998244353;
6 e# J" U- x; _* ?$ ?9 ?' X$ ^const double eps = 1e-7;$ J& P2 x# P3 F* p2 m
" P) C" @8 Q: Q5 _) \7 K6 D! M7 ?8 G
struct tree {
# h/ ^( n* d# J4 q int l,r;
9 I |% E/ Q7 S; `+ M8 J4 u4 r/ |4 S8 O int p[10];" Y5 W A% |/ D- K6 e
} t[maxn<<2];" r7 I+ y5 I( }) G) U- Q$ l
. ^# K0 c2 V' x yint l,n;
1 P, e0 [% n$ M+ W
5 y& l' `# v* R& x8 C$ ]void build(int i,int l,int r) {% d, g( j2 ~. B4 W
t.l = l;
/ f, ?4 J q- F W t.r = r;
" U5 N; Q ^/ L. f+ _0 |: p mem(t.p,0);
/ b5 \6 O x# X/ q0 A4 G
- A) D o6 |0 Y: D9 f3 Y- B if(l == r) return ;
% _; }' Y B" Q% |" W: k int mid = (l+r)>>1;
2 v) O8 @, t) K$ X build(i<<1,l,mid);9 t3 `0 B6 C4 m C6 C) }
build(i<<1|1,mid+1,r);
~. u9 O5 E7 P {* c7 L, M return ;
$ t5 R; S; h# v' s}
& ]& Y7 n! }2 S% ?& s u* ~. G& \9 b+ G$ {, o7 i$ c
void update(int i) {
8 V4 w$ {: Y# R int cnt1 = 0,cnt2 = 0;: V( X+ [& Z! ?, @4 S+ @* J- N
for(int j = 0;j< 8;j++) { {6 _9 v7 n" E! l
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
2 ?2 m$ Q3 o, ~" ?+ G0 R t.p[j] = t[i<<1].p[cnt1];. f( x6 @6 M% X% [! n8 m8 D
cnt1++;
5 w& g/ t* P) |& @" n: } } else {
; V" N% S# x, i t.p[j] = t[i<<1|1].p[cnt2];
* H0 \& k( L6 J; q% [0 W6 q- q cnt2++;
+ V; @) Y+ N1 a) h( G/ {- o. s J }
6 M5 u# f+ f9 C6 {7 ^ }
9 |6 p ]2 f# Z3 Y7 u! N return ;# i. \' P- [8 X5 k
}
4 i9 n* z& o7 A8 U: [8 L) i1 ] T- Z( p/ l \- [8 o
void modify(int i,int pos,int val) {
0 ]' `; ^1 N% O- |* |0 c if(t.l> pos || t.r< pos) return ;* p- X( Z4 s q( ~
if(t.l == t.r) {6 Y3 r9 A& r& {. T0 y- r2 O" b+ P: U- j
t.p[0] = val;0 @4 ?7 p: G. x
return ;; W4 h& I$ Z# ?' t
}
0 h% I4 X! \# W- I) c/ k. _# G modify(i<<1,pos,val);5 l: [1 q7 j1 i% X1 f6 w: [
modify(i<<1|1,pos,val);4 o2 T) F u P g
update(i);: M5 |" A5 H! l h
return ;8 G+ }5 T/ n) l0 E
}
7 Z/ ]4 o2 w1 H8 M' M
4 [9 O9 a; K$ jvector<int> merge(vector<int> ans1,vector<int> ans2) {
* R0 z5 O( D/ U4 c+ K$ x vector<int> ans;. k( c& @$ }+ @0 L# c, c2 u
int cnt1 = 0,cnt2 = 0;
3 E& I! R/ j4 y for(int j = 0;j< 8;j++) {3 J5 c( K4 _4 e1 p' a1 {/ _) A' t
if(ans1[cnt1]> ans2[cnt2]) {& P7 ~2 h1 A* K4 N
ans.push_back(ans1[cnt1]);
- ^. v+ D+ R' e% r, F cnt1++;) Z, b9 U: i2 s3 d
} else {- g0 U8 O% H) k3 l
ans.push_back(ans2[cnt2]);* ?2 f' K7 I5 c+ B; k! A& O
cnt2++;6 i1 C& j. o! y* S& P
}! {0 O% P2 r* T
}
$ W' i$ p2 f3 e2 L4 p; C: Q return ans;
- P6 a3 @. i& }( K+ p}
) {5 v9 t( r$ u1 a# }& s8 {
/ _) `6 ~" I" b! f- ]7 U. L) g! Xvector<int> query(int i,int l,int r) {( i5 e. w5 t: E( l- U1 u
vector<int> ans;/ V; m% h5 e6 c. t% o$ v
if(t.l> r||t.r< l) {
4 Q9 L- ~' Z: G- I0 y. X/ ] for(int j = 0;j< 8;j++) ans.push_back(0);9 K, d. z: V; z/ C7 C4 [! f
return ans;
" i! ]- ]% ~( M }
+ @; l/ [5 S/ Z4 n+ n; R1 _$ {9 e, R- N0 _3 @5 o# j
if(t.l>= l&&t.r<= r) {
+ C: G- U; l3 g0 e; N6 m for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);" \& P$ x; m6 w5 k- v+ |& d, {9 t
return ans;
7 f% a2 I5 n% D$ [% U: g. j& `7 F }0 ~$ k3 k/ V }4 j2 J; l
0 \( s2 x7 l2 ~+ i
return merge(query(i<<1,l,r),query(i<<1|1,l,r));
7 a$ M2 a5 k' F9 B$ ]% V}
, h+ e% n0 Q0 s& g3 \/ @
: Z U- b. j6 h9 J9 |int main() {
# b8 V: x; n% y. E2 f: B9 T cin>>l>>n; D( q8 z+ ]& @' `. o/ P+ d
2 U1 q8 U% `, g/ w* H
build(1,1,l);/ ~, E6 f: T# Y$ _6 [0 c. ~) g
char c;" H$ u3 b! w, I% W& ^5 t5 r
int x,y;
; v$ a, t5 b3 p* x' U" I: O while(n--) {- }" ^9 R4 T' f' J/ \ W% d6 {. C
scanf(" %c %d %d",&c,&x,&y);
: a& h6 X7 t. x& i( Q" k1 P if(c == 'C') {
p# Y m8 T# J modify(1,x,y);6 C# G# D$ c, p1 k9 ^
} else {' E/ i) C$ b6 g$ O" w/ |1 i! A
if(y-x+1< 8) {( B* e9 E( {6 F, @; z$ N5 a) v
printf("0\n");! d6 m. T& J# c" J4 K$ t
continue;0 a+ x9 c( s1 V* Z
}
7 Y: v7 u4 A: i E! Q! | vector<int> ans = query(1,x,y);* B g3 V& Q; V( T6 E8 X3 ^0 [
printf("%d\n",ans[7]);0 S- N" x& L* ^
}
' x2 w$ v4 m4 W9 N: ]3 B2 ~ }: @9 Y* j. \- i k D3 F$ g
7 L f* L) G$ v6 t return 0;. a9 a- o, S: ?: L& t3 K9 U
}# ^# h) h% D$ ~3 j6 b
. D, ~9 s8 J% Q' z) E' y# g4 k---------------------
7 n9 I! d; G4 H ?作者:nka_kun 8 Y4 `+ X! r2 r+ d8 p( {+ l% S( E- J
来源:CSDN , N. G) g3 B6 f& B: c$ h
( F* T8 u2 i3 f1 u
# [# N9 u( e, D- s4 e) Z _6 H1 W8 M/ G; S) l6 V! M: a
|