2019第十届蓝桥杯B组决赛题解第九题# S4 p) A$ @! o' M7 ?
6 V' H( p) G2 T( Z题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)/ D% |2 X) \9 x/ W+ _% t
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
9 O5 @- ?' K+ _4 G# Q0 u ^# e查询的时候返回含有8个值得list,并不断merge 代码: / }9 }3 C) f! O0 y
#include<bits/stdc++.h>
& R% s' n! j) _5 `1 q#define mem(a,b) memset(a,b,sizeof(a))
' {0 ^- s+ {/ b9 O! s; l- |using namespace std;' {5 e" S0 T3 E: N0 \ [
typedef long long ll;
1 n0 z4 G1 g$ N% uconst int inf = 0x3f3f3f3f;* Z' q5 n5 D" ~& D
const int maxn = 1e5+55555;" _) ?3 g. t8 `2 m6 `4 Y/ u+ S
const ll mod = 998244353;1 a2 k N# }% J4 w( H9 C" M) w; c$ K
const double eps = 1e-7;2 m+ N, d1 K/ M k: ]! H5 ]
" ?8 X- V! J/ Y0 _2 Z+ a
struct tree {: g* J9 H5 e$ O; }( w
int l,r;7 E' v) ?$ r, J8 R
int p[10];8 G7 e/ O: T0 L( _9 S n0 N! E
} t[maxn<<2];
/ ~5 o1 @) p/ Y* `5 [0 r# p1 P# {' d1 K5 p! E3 r& I( @2 ^6 k4 X
int l,n;# s4 L% I) o9 {4 j% M R" a
5 |# P3 Y( e. t& M2 i `& [void build(int i,int l,int r) {
* Y; a9 D3 e2 k* z! m8 z: N t.l = l;+ @: H3 a" a% s- {7 I
t.r = r;3 K7 u! {; d$ z5 ]
mem(t.p,0);
6 j+ T, q' B, y3 A- W8 o: G
6 @' v5 G. j0 a- [/ G, L if(l == r) return ;0 a; J; O( Z+ d& j0 B3 t
int mid = (l+r)>>1;' X/ g. w5 L+ ~2 c
build(i<<1,l,mid);2 _- r' W1 Z* x# `9 P
build(i<<1|1,mid+1,r);
* Q5 r' m1 E' u" r7 G6 g return ;3 F/ Y! Q. k: S: q b
}, K: F+ |) D; |' U: {
& Q& m! o& j5 S
void update(int i) {- J$ W3 Y: V/ A/ s" z! Q* `& \
int cnt1 = 0,cnt2 = 0;4 m; D4 N0 o+ U. O, w$ M7 A
for(int j = 0;j< 8;j++) {: L* ~3 t; B7 i2 F& w1 |
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
6 l) b' N* a' N6 h t.p[j] = t[i<<1].p[cnt1];
$ m0 B0 W w$ i7 G. H cnt1++;
' p. q! {* i* T4 R! C7 N" Y& M e! \* g } else {
0 y3 h+ j) Y6 I, B t.p[j] = t[i<<1|1].p[cnt2];
! ~# L( }; b: f7 x: `6 g cnt2++;' H: v1 Z$ [$ c
} P5 r- l$ X+ l
}
8 N/ A' { g2 C x return ;
0 s* q, Q3 F5 M P/ ^: t}
$ E2 {5 o: F$ H( G# k
) ~! ]0 r9 a: Z3 |6 evoid modify(int i,int pos,int val) {
4 d, u0 ~, D) e7 a7 F( ] if(t.l> pos || t.r< pos) return ;
" c- L; F0 P' E0 M if(t.l == t.r) {
8 C+ v2 B9 {( l$ w8 N3 N9 Y' U3 g t.p[0] = val;
$ A. d, t; S8 [% X, q2 Y( B1 C: y return ;
# t- G: ]# k$ \9 g }
) A" ` B7 A' D( I- {3 q8 ^ modify(i<<1,pos,val);
# Q k0 a* T- ^" H% Y9 @- c" a0 k modify(i<<1|1,pos,val);
- ^/ n3 U0 E6 k6 [) ~ update(i);
6 v L* a; h) U; w: ?- Q6 K return ;3 s o2 k. c3 G0 }- h! I
}
1 Y8 F$ y: O, b% e+ ~, j6 W6 f4 X% K K& `
vector<int> merge(vector<int> ans1,vector<int> ans2) {
( i, ]7 `3 z' N8 \ vector<int> ans;7 c+ y1 v; k" h, U/ ?
int cnt1 = 0,cnt2 = 0;' D, U" V% `5 x2 i3 m
for(int j = 0;j< 8;j++) {
( N7 K5 n9 a9 R' u r3 v1 C if(ans1[cnt1]> ans2[cnt2]) {0 }! z7 L% F+ v! k7 A
ans.push_back(ans1[cnt1]);
1 {: C; H# E: L9 C5 c cnt1++;
0 f) w/ u& A9 x% v } else {6 I( \0 t) F' X% u7 h N
ans.push_back(ans2[cnt2]);
4 W7 l* }. O4 e: g cnt2++;; }! D7 o& U. d$ Q! @* `
}
( J- V' W3 G# h( w }3 c- x1 B1 c, o, M7 z- }5 w1 x
return ans;
6 [/ z$ o2 z* J6 H}
/ [2 x$ v1 v4 t6 l; ?: w
& i% n. p5 g( Y( r+ Svector<int> query(int i,int l,int r) {6 g9 k. k! i: }* z, W! h
vector<int> ans;
5 [5 D8 o/ S' @0 y$ H, v: _ if(t.l> r||t.r< l) {
9 N2 e, n0 F; _# S for(int j = 0;j< 8;j++) ans.push_back(0);
- ~! z* @6 k9 r8 d! d return ans;
: X# }5 `, q- ~- {: t3 c }5 V7 z: B2 b: P& I+ i( t+ P
# p. h- {! R* g$ g* s& I: ~
if(t.l>= l&&t.r<= r) {! J+ q; b3 a3 E+ w4 m, k( C7 E
for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);8 e: R* q! b Y# J0 {- x
return ans;* C% {% u H* j/ @- k6 K
}; l7 P/ N% }: I3 n/ [
( A$ ~- ]% u0 C5 z7 z% H
return merge(query(i<<1,l,r),query(i<<1|1,l,r));" ?" {# W: `* a; _) ^& r
}. Z8 M' Z! \$ D9 S1 g1 ?, a
: t* S7 N' k a) b4 m
int main() {# ^( e: \9 J* w. X
cin>>l>>n;
1 `; i' s$ ?' l. Y& u; C4 n V5 R/ Q$ O% a% a5 V5 O
build(1,1,l);2 n; N$ P1 T+ {) i5 e
char c;
6 E) c+ J3 F& \" I5 M int x,y;% x+ m# {, D) p5 f: k5 f# z
while(n--) {# H. L3 R8 W5 n1 K
scanf(" %c %d %d",&c,&x,&y);
8 b) p2 p3 L9 n, d& M: ]6 y, } if(c == 'C') {" x4 R2 _) [) `, O; V6 t
modify(1,x,y);. ^: [8 X5 f0 ]; H3 l9 h, a
} else {! b8 Q* v; W, x. z2 j' S, E
if(y-x+1< 8) {
" o$ |' @. g: D( D; ?5 N1 S printf("0\n");) }% i. I. t+ j: E
continue;
: S) [: j- S9 v! q }
6 L( k1 y& `4 ^+ H9 N vector<int> ans = query(1,x,y);0 }$ H" R6 D+ w+ G1 F
printf("%d\n",ans[7]);
9 v& D* l/ {+ y }% }) ~* G4 Q$ s# a2 [' S2 m
}
, i1 B) E* l5 ~+ M- y( P; [3 f4 Q O+ P8 F& Q) F* ]" t
return 0;: K! @+ s' Y0 i }8 B
}
! U# |) u. ~3 l' d! g2 \* Q) g: W* j
---------------------
8 t/ U6 x! t( Y7 z作者:nka_kun - l5 r3 j* d9 H- u' X) d- C, |1 N
来源:CSDN $ y& X8 v# c4 M Y* I( d
# [$ |- R' l6 f# ^
! d: e; x5 l) Z0 l; p0 @
: ]% X1 ?! h4 P$ J5 S7 T" [- O H |