2019第十届蓝桥杯B组决赛题解第九题
8 M6 }& L: w K; X1 C& @: h
C% Z( B$ K) G8 @# x3 }题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)# Z; h& g E" |, W9 Z
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8' Z2 I' R/ B& ^9 r$ D9 [
查询的时候返回含有8个值得list,并不断merge 代码:
: J. F; R7 Z. Y- _' x2 A. o/ c#include<bits/stdc++.h>
' p& b% d. G; |+ ]8 x, ^1 s1 Y#define mem(a,b) memset(a,b,sizeof(a))* }3 i( @/ q& a8 L7 Y: n
using namespace std;' p+ l% i1 \# I: r6 k' B
typedef long long ll;9 n# i- E6 E% H! p: y
const int inf = 0x3f3f3f3f;
+ p0 o. D, c# s- L- C) v% uconst int maxn = 1e5+55555;$ l ]7 |: A$ y
const ll mod = 998244353; i( e t/ n# W9 Z
const double eps = 1e-7;
( X2 }( I- C3 i. j1 Z
( `' L+ d; l8 T( Qstruct tree {
" F/ D5 {: r! Y int l,r;1 u9 e1 |* Y4 U- O7 ^
int p[10];
# ?; ^" q; k5 z} t[maxn<<2];1 c3 k, Q: T/ {' [! g& Z; l: Y9 U
% m2 |" d3 A- u# U$ M# a4 M4 y# b
int l,n;+ A% W5 C6 @; n Y1 s
" ~$ W# F3 m8 A' H! S& G
void build(int i,int l,int r) {
9 o* V/ k) w$ Y t.l = l;, |# P8 A7 Z# p) D: U2 x% q
t.r = r;
% ]0 j+ b& H4 @: {. k( q( A mem(t.p,0);
% T- w6 N0 J. ~$ W
9 H/ {# _- Q+ } if(l == r) return ;
5 _) F2 n# f0 h7 I X1 c int mid = (l+r)>>1;3 _- d) o/ F; h% \9 e
build(i<<1,l,mid);& q5 T& D9 n1 Z- i' c5 P
build(i<<1|1,mid+1,r);! A5 o( A( i ?" x3 n# i
return ;% _9 y K& b* x& o4 h
}
* b1 x8 l K( y; G* W( K7 p: |' N
! A6 P/ g8 `6 t4 U5 {. kvoid update(int i) {$ X, \0 z7 {, k! ^- t: P
int cnt1 = 0,cnt2 = 0;
# u& r: O2 D! T% m for(int j = 0;j< 8;j++) {
3 A- J- r" |+ F5 I) N if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {! J9 G9 Q: _$ I9 y# A/ f2 [! P
t.p[j] = t[i<<1].p[cnt1];2 X; Y. l0 N% r6 f
cnt1++;
& e' W( Z/ _, Q" w* _ } else {
0 g& u& V6 z* c- m, c t.p[j] = t[i<<1|1].p[cnt2];8 m' Y, N) D3 C* I/ a; I
cnt2++;
* L( N4 ^; k# W8 b; y }. B# O' |9 E/ P3 I
}7 p$ A+ a* @6 r
return ;$ X% _% j( E- v1 g/ _, z
}
$ P/ Z% [3 ?8 G8 \# o) m; R0 r* ^' ?
void modify(int i,int pos,int val) {% z% Z4 V; p: b
if(t.l> pos || t.r< pos) return ;2 a4 t- u/ A& d' q
if(t.l == t.r) {) j' V0 j J4 U6 F+ _, U
t.p[0] = val;" w; {# k( E: F
return ;
& e7 J9 e P. m7 j0 i. ?" q }) L5 C, [! w, W+ O( d1 G3 U
modify(i<<1,pos,val);
1 H4 Y u/ D. F4 j @% z0 x modify(i<<1|1,pos,val);; I' y. P! l) F+ e( [2 N: J8 C
update(i);/ H% z! @' g0 V, H$ k! Q) \
return ;
' |" [' E9 H' P}" n, h2 O6 A& s* g* [/ u+ J
9 ]6 M- U1 q) Y, `( K! {$ O
vector<int> merge(vector<int> ans1,vector<int> ans2) {
8 r9 M# w) G: s vector<int> ans;
8 x/ h) _5 T* q int cnt1 = 0,cnt2 = 0;3 r+ q) l: S% \* ?2 ?
for(int j = 0;j< 8;j++) {
. V8 B9 L8 q7 e3 i& S" v if(ans1[cnt1]> ans2[cnt2]) {; {% ?2 d G$ M! K0 V
ans.push_back(ans1[cnt1]);$ ?7 x4 y- j+ c5 q6 }3 k
cnt1++;4 u" e2 {; H7 K' P6 z# j& }/ }
} else {- l7 T4 m$ Q/ v& q$ F
ans.push_back(ans2[cnt2]);, R. h( ?; R8 \
cnt2++;
0 j# J( s/ X8 D% [ }
" N$ j: m5 y+ C2 A7 c# | }1 J6 a/ `+ {; |4 F& ]" g
return ans;0 z+ U/ K; _4 F8 ?( R
}
/ r" ]' p( _5 _$ P2 h
5 y# }; m. A, ? t9 I+ n Hvector<int> query(int i,int l,int r) {7 a+ J$ {+ u, u. j
vector<int> ans;- N0 U# G: F0 _3 N9 y
if(t.l> r||t.r< l) {( g2 B) r& o. g7 T$ m/ n9 r0 h
for(int j = 0;j< 8;j++) ans.push_back(0);
" q& w3 A( [/ F4 { return ans;
4 A4 r' u! x9 Z) L; e$ @ }, f" O0 _/ I. g. A1 t1 C
& N* y9 t7 b1 l if(t.l>= l&&t.r<= r) {
0 V% c" \8 n5 ~" E4 Q: Y9 \8 B for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
2 \% A3 l( r* h) G H return ans;
. T0 f* U" G/ @# A }
- d' T* f2 A, M! w& ~
. s6 t+ I" u: B6 |9 s! i return merge(query(i<<1,l,r),query(i<<1|1,l,r));
* M: h, V. N1 R9 Q" ^, n}
4 G1 u' o3 [1 w) a n5 @
8 l4 f9 }5 L8 u3 V. J4 Xint main() {/ c+ B2 o; }6 o2 E) H. @
cin>>l>>n;# O3 P* M& X& P7 M1 j
" @7 B @0 `6 U) x _6 A! h
build(1,1,l);/ D; S# t7 i4 s1 E
char c;, {; n% h( o8 }, R
int x,y;( ]% g4 ~- W# N% O
while(n--) {
f" J0 D% G' R4 E- X scanf(" %c %d %d",&c,&x,&y);
, }. i3 [( e5 |; U' t5 M if(c == 'C') {9 ?5 O. d3 }: y8 z) W& V
modify(1,x,y);' }3 g$ u# G# m3 n; P! O% ?
} else {$ \) W9 E a5 Q Y7 `9 d
if(y-x+1< 8) {4 J' @9 }+ T0 b% j7 U
printf("0\n");+ h* F' W1 S b6 S6 P! u. H, a% c
continue;
a2 y" x+ `6 l$ K e: u }& N9 g2 p5 q& K+ j/ m1 f
vector<int> ans = query(1,x,y);# h" i0 h* F. |- W( ]
printf("%d\n",ans[7]);: c1 t) h5 ^5 g
}9 y" l! P! y$ F( {" P0 J$ B6 x6 j1 X0 Q
}1 J7 p" ^; k B/ ?( ~9 W" \( i
8 n4 c4 E5 {5 S. ]9 s) W0 x3 r
return 0;" b- [- B9 c, [- L# `- S
}
) I7 ]; d. z$ m5 h; u5 z) T7 O! p1 e; |1 A6 |" M
---------------------
5 A7 M3 o. e. E作者:nka_kun 7 C9 @! Y) u, X' a) l% @, }% t9 u/ ^0 B
来源:CSDN
! h; P8 n! ?7 x/ }- U7 |0 d$ X, O4 \ o" k! T* f
- z8 {7 m, v' Z3 a' n5 G& g! P
5 f# C$ h3 [9 z |