2019第十届蓝桥杯B组决赛题解第九题
8 w3 {+ U# e8 o P2 a; M7 T I9 H# f+ ]$ I
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
* @ h# N$ v, T) R4 D每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
+ E1 u, ~) S6 y& V; }2 I查询的时候返回含有8个值得list,并不断merge 代码: 4 m. M; u$ K1 V$ }
#include<bits/stdc++.h>, I7 a! r4 ?' }: j6 d/ e
#define mem(a,b) memset(a,b,sizeof(a))
" m# M+ y4 g+ k: D' x2 Nusing namespace std;" y) Z" p5 B! ?" j& d, p% C5 m
typedef long long ll;. { r, k3 |. M0 ]; A) ~
const int inf = 0x3f3f3f3f;
" v& w$ V! h* r m4 E7 D4 uconst int maxn = 1e5+55555;
- T/ T, n. ~6 |5 w; E) mconst ll mod = 998244353;. t* |% R5 \' \ ]
const double eps = 1e-7;
0 k) e- f; R4 t! a( q# S+ O- E4 Q. [5 Z3 z
struct tree {
9 t5 N. U. ]0 V, `) h" K int l,r;
0 Y) u) m/ [* J, {, ~9 ~, r int p[10];' A9 t" v. D7 z2 }+ k- _
} t[maxn<<2];1 v5 n. F8 Q& d/ `
3 Q9 g7 z3 i& g. f, C4 k# {int l,n;9 E5 `; K' l7 ]' x: o$ H+ z
z5 b S* c, ~) A7 e2 ~& G! \1 n
void build(int i,int l,int r) {8 o S8 }/ w- Z( H/ }3 V
t.l = l;7 e& m6 A/ V. J% D1 D' H) k+ @
t.r = r;
8 n( w( B, c: l) r- Z mem(t.p,0); Q3 J5 K: }5 g
& w/ v' r6 l8 D% j; w6 C
if(l == r) return ;) n8 i$ N" ~: I/ o; d
int mid = (l+r)>>1;) {- j" M4 p- r) W! j. ^1 H
build(i<<1,l,mid);* k& k* x% h- _, q+ L8 O
build(i<<1|1,mid+1,r);
) i; _4 I$ M5 z6 [( F return ;
: x. z5 Z; H5 W6 f# o}% o1 i( G9 v7 K6 I$ }
6 q- l3 [; G3 o# n- bvoid update(int i) {
7 f) O/ z, ~) o4 g9 F+ q int cnt1 = 0,cnt2 = 0;
7 q: W+ k9 |% Y for(int j = 0;j< 8;j++) {) v7 h/ W, p% [1 {3 [
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {3 v! @- A. w2 q/ ~0 A
t.p[j] = t[i<<1].p[cnt1];, Q5 I6 B" x9 n+ G! C
cnt1++;
. K0 y8 j' ?! P, o4 d% P6 s9 f } else {7 M4 h/ B$ s8 h" S1 C- t' P
t.p[j] = t[i<<1|1].p[cnt2];4 p! I; t8 z" z0 m1 S
cnt2++;
+ r7 M2 [: l' W0 i0 f& @9 I: X }* ~/ s, [! ~: Y" G& l4 ~
}
+ ^0 k& N4 k7 v return ;. p S7 s9 ~# P* F* Q" w
}
8 Z7 H2 J# M2 ~( D+ g! I3 h3 A$ v- K; g# T9 }# @! R
void modify(int i,int pos,int val) {" U9 M; t* V, |
if(t.l> pos || t.r< pos) return ;* b7 t: N' {# G' z
if(t.l == t.r) {. B4 j7 X: [% u* Z% m0 y7 t# E. x
t.p[0] = val;
6 t+ A4 z2 e- o$ T; M5 H* i+ E return ;
0 |/ a+ t% `7 [5 Q0 q' T. G- l }( L4 O3 {6 T h! w
modify(i<<1,pos,val);; w' y8 C6 G' x6 U0 K! B5 @& |* z% g
modify(i<<1|1,pos,val);) J, U% }# H2 o
update(i);
n8 S8 g4 e8 x" Y- a/ P return ;
7 V' H, l. |5 u8 L. Y0 H' j) x}
. t& U2 C- l/ b: k& E
. k& A" _3 U& gvector<int> merge(vector<int> ans1,vector<int> ans2) {* ~: o' k; r5 E
vector<int> ans;
3 c8 Z( G, s f8 [, s2 H% v N int cnt1 = 0,cnt2 = 0;
3 `' `& x' H9 }7 b% @9 c for(int j = 0;j< 8;j++) {/ B' k7 o1 a% T5 M3 U3 K) P
if(ans1[cnt1]> ans2[cnt2]) {
: ~4 E# h7 V- B# P8 @; ? ans.push_back(ans1[cnt1]);
8 \( n0 D8 E8 Z4 |3 D' E4 X cnt1++;
" d% N' A7 K% g- f; v } else {# a! q: B. z4 S4 i/ W# g1 f$ N
ans.push_back(ans2[cnt2]);( W, o* \( N( D! O/ {% I8 S
cnt2++;6 w6 n4 ^! B, M: i; _& d
}- `' N% j) j) _; E4 ?6 X, A: T
}
& P& [; t' h8 L1 B9 U1 C return ans;: C6 y$ X7 a; L7 K; d" d+ D
}3 Q7 M' X {7 k' }8 O" l0 M5 _
) \+ _" x, G9 N
vector<int> query(int i,int l,int r) {$ w! m+ M+ S4 y, T6 M
vector<int> ans;: ^' k5 r% ^* ?" F' e
if(t.l> r||t.r< l) {+ J* ?/ \6 r: I! I
for(int j = 0;j< 8;j++) ans.push_back(0);
% k' b! A7 w0 P6 o) Q! W1 L return ans;# n$ z& }+ R8 Z# N2 G6 V7 o
}* ^. t' y( [! n) C }) e) k
2 ?+ Y* e! ^) `( V V9 T if(t.l>= l&&t.r<= r) {
0 S# N/ E9 `; a7 D' | for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
2 | j% }1 ?7 \0 |" e return ans;
, H& S" _& z4 x; }. T }- P6 _, j. o r* `( Z
9 w. d3 E" u. S' x: V4 X& e0 k return merge(query(i<<1,l,r),query(i<<1|1,l,r));
C) \! i6 C3 z. e4 H7 d% N}7 L" e4 o9 i) |$ r* J
% B3 A* m2 \4 ]+ F/ D4 P9 U( Hint main() {9 w3 w' r& `& [+ q A6 v
cin>>l>>n;0 Q; p. i4 `; U9 K+ _
5 J+ ^" X2 ~2 m% p2 H build(1,1,l);8 {# G" a) c! e( B' k
char c;: U, e: @9 L. z1 v. o
int x,y;
+ ?" Y& P+ \7 O! |6 { while(n--) {; }. ~& f( G+ p. f
scanf(" %c %d %d",&c,&x,&y);% U, h( b" x7 C2 S; t
if(c == 'C') {
4 B9 b2 s# s1 x- w modify(1,x,y);
( J5 r8 M6 T% G- L" R, z) Y* T6 D } else {
1 S2 M9 m7 ~ L% Z8 L if(y-x+1< 8) {
# ^/ m# X) T' f7 y( Q printf("0\n");3 Z; r- ` K) i3 N! H8 [5 H$ H
continue;
, b9 e7 W" o$ F6 T }, `2 \. L" ]' l1 [/ J& I2 i$ Y
vector<int> ans = query(1,x,y);
7 M( B1 E# i+ a% A printf("%d\n",ans[7]);$ R; T' P- W2 k. x# l. r& \* L
}' A1 X( H2 M0 n3 i
} G, N, C: [- I. N9 H
) X& d% @- c4 L$ @) Q% l9 o
return 0;! p3 U2 Z& P5 E' U# |- I: o
}* L( F& j& D3 [. A1 {
" D1 L% Z7 N! r: a) y--------------------- 9 I: a2 b3 {: H6 V2 C$ @9 d4 C; I# Q
作者:nka_kun 8 Q5 U3 Q, Q" j7 R
来源:CSDN
1 `6 J( {3 ]/ k1 g' W7 N ^" s' o! {' R
5 T Z7 o& x3 i
2 M4 e8 T2 i+ B7 P$ m
|