2019第十届蓝桥杯B组决赛题解第九题/ Y0 k7 F" R. N5 S0 m8 X
% J6 D& L; h) Z: X2 q# \题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)/ ^! V o9 P l% r0 t/ a. P
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8; ~0 l+ R% K$ j# h3 Q
查询的时候返回含有8个值得list,并不断merge 代码: # S- q8 r: {; z/ u$ d N
#include<bits/stdc++.h>9 C7 i& F% n) ]9 F8 N& z2 Q* y9 M
#define mem(a,b) memset(a,b,sizeof(a))! i% H, o$ A2 x" s# H
using namespace std;
8 l, C) D# H& `6 etypedef long long ll;
' L( k; g* o# ?const int inf = 0x3f3f3f3f;: x2 L* ~( D3 r! B* Z4 l' O( [+ O5 ^
const int maxn = 1e5+55555;3 R7 u3 A& A1 Z
const ll mod = 998244353;6 d- T5 l$ I/ S) v# V
const double eps = 1e-7;, O+ U+ ], c( T. z" r; N+ J
, Q& U# e A" ]; U
struct tree {
" Y9 [+ P" |. m3 {# A2 ]; x; F int l,r;; e }- O% [9 ~, y' m5 X
int p[10];
- A- D. K" ?! E! g# u8 A! _+ p} t[maxn<<2];: O$ k) D% Z( H2 ~" M h$ v% N
( `7 x/ |& \- D$ B0 e6 Mint l,n;
, X `7 |: N7 l8 k1 n6 m. m0 o! m6 G, U" m! M
void build(int i,int l,int r) {
: V! i$ z7 _0 T: E+ E$ E" l7 j0 m t.l = l;
" P1 Z, T! r5 p t.r = r;
4 @; \4 ~8 K% v mem(t.p,0);! Q" y- J& |0 f. H% d% ~/ s' q2 r
; B& C& p$ g* r" F' Z# x if(l == r) return ;) X- Q A, E# T! c% R
int mid = (l+r)>>1;
w8 a0 v+ A; B1 v: G8 G build(i<<1,l,mid);3 j* s/ ?" F, c4 x% ]9 m
build(i<<1|1,mid+1,r);/ @7 j. z. F0 X& L
return ;0 c9 e Z$ o7 M. x" w
}
( |# j+ q. a) B4 y$ K# p: V
) J3 q5 f3 H5 ovoid update(int i) {7 z/ Z/ `0 D w" T: d% K- A
int cnt1 = 0,cnt2 = 0;
2 d9 |. o) ^* u4 z0 ?6 b" F) o- E for(int j = 0;j< 8;j++) {
& s1 M2 q( Z# n8 _& ?/ ]: U if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {! a9 V8 Y& U q; C( E
t.p[j] = t[i<<1].p[cnt1];5 c- b6 I7 G+ V+ q
cnt1++;
+ {) h/ [$ ~! J$ z/ R6 T } else {
0 E+ S [. ]! |: P/ C; U. L* @: { t.p[j] = t[i<<1|1].p[cnt2];/ T) L, g5 K5 P% [+ L; J
cnt2++;
2 j* ]2 i5 `7 B) _; r }) ?" l+ h) a/ a- Z- A
}
$ G' l a6 X4 w: Q+ @, a return ;
9 i G1 ?! v4 |& N2 q( x0 C1 R8 z}
& g, ^: c/ N7 m8 Q
/ [+ ]) D( W* M$ c9 Y; `. fvoid modify(int i,int pos,int val) {
- N2 L0 o2 c" b3 u" W if(t.l> pos || t.r< pos) return ;; ]* `" b) T8 |- `* v
if(t.l == t.r) {
+ H* @4 L) N4 ~# E5 s t.p[0] = val;( b$ F- R5 d# q2 z1 g6 N
return ;
& w) n' J5 E7 r4 A }
& \, A/ o. L( ^% e4 ]+ p+ ^0 T* j8 V modify(i<<1,pos,val);
1 f. p4 c, ~) i5 ~! _6 K( [ modify(i<<1|1,pos,val);
# ~; Q9 v& C1 b: }5 b8 Q2 S' S update(i);1 j7 m* {7 F% C+ t4 z# I7 f( G9 X9 r( L
return ;% v0 i! D7 U) o$ Q' h4 \* {
} A7 w/ i% i; d6 Y2 I5 r8 D9 O: x
$ O7 d% h$ g- `* @9 O$ H2 kvector<int> merge(vector<int> ans1,vector<int> ans2) {9 r. W! e+ @/ j! |. v
vector<int> ans;
4 K* C4 H, N& s0 a int cnt1 = 0,cnt2 = 0;' A/ D$ {3 d4 T2 p+ L$ E
for(int j = 0;j< 8;j++) {
1 O2 j a" B$ s' p% H if(ans1[cnt1]> ans2[cnt2]) {
9 P3 t/ U) N: k5 f ans.push_back(ans1[cnt1]);
8 m3 L8 v: \* u' N8 T cnt1++;7 s9 N8 a9 t: }4 Y. K+ S1 L" t
} else {4 v7 B v5 d& y. U6 s
ans.push_back(ans2[cnt2]);; F$ a$ Y: E9 b
cnt2++;5 U, `- L4 M+ Y1 {" }- u
}0 Y }0 p- @; _3 Q2 R. I$ G" H
}4 ]7 O" B9 K$ }' x! p* ^% y
return ans;1 o( L N7 r* E f2 z4 D) H5 v" [
}5 j( A8 P( F1 X% I: U9 `) M
8 ]8 X! K( r' I; L9 S6 Z) U
vector<int> query(int i,int l,int r) {
% L. K3 E4 _# F( d$ c2 {8 U vector<int> ans;4 `$ M1 { U8 M8 `6 L! q& z
if(t.l> r||t.r< l) {/ M7 n) _! t$ U. l# E: y2 h8 d( @5 d
for(int j = 0;j< 8;j++) ans.push_back(0);6 `5 N1 _: z8 ^
return ans;1 I: V V; c6 r$ h$ b( O7 e$ P* f5 H
}6 d& `4 l8 o- I
! j) P, ]. S5 `$ e' ] if(t.l>= l&&t.r<= r) {
3 {: f3 o% ~9 {% N for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
/ I+ |3 o$ Y, c4 l3 Z! w7 w return ans;! Y$ G# v, b( b8 g! a
}. K7 `! C1 t( R# k) @
$ ^1 {# w' O7 o+ Q8 F$ v' V. E
return merge(query(i<<1,l,r),query(i<<1|1,l,r));7 T% @3 T' E4 a% _, Q0 i# ]
}
! j" ^* g% D- g- O4 h: E8 m1 B9 t( }$ O
int main() {
- R7 T) f' J0 G, s cin>>l>>n;
6 K: r, K) P9 u' `+ K( ^- e9 k( J! o9 H- @( q+ ]
build(1,1,l);
m) O" e- I( X. x0 M0 G char c;
& [' P% v' [2 `! H8 S int x,y;
7 s. h* e9 a P: Z9 K+ _ while(n--) {
' ?* c1 C7 N. } P! e0 P u; i& c scanf(" %c %d %d",&c,&x,&y); F( s5 Y* N* u d
if(c == 'C') {
+ I \5 y% S) r3 C! }) R" t modify(1,x,y);: t" }( Q) p7 G/ u: ]$ b
} else {
& G4 p# ]# V! L. R& t! }9 y if(y-x+1< 8) {
5 S3 n5 c3 X. w' w printf("0\n");
3 {! \; g9 L5 v4 I/ W; C/ b" G continue; U1 P# L; T6 e O$ ]( U
}7 H: ?3 ~) q# o; X8 N
vector<int> ans = query(1,x,y);
. G( W4 N9 G" f2 K8 V. i9 o+ k printf("%d\n",ans[7]);' G0 E) b8 ^* j- C- n
}& G/ `# o) l6 l) \1 C
}
5 N- I! D {$ r+ b0 B$ {
+ Q3 t$ u1 ^" t( Q ] return 0;# l& b; g* k8 R0 b3 W% \
}/ l5 e& {; P* K. j
6 Z. D. f$ `6 q$ V6 w! e---------------------
6 o) y! ^$ e, n9 R. x$ y. }) S作者:nka_kun
H0 L: z1 R$ s5 H- F7 `( M& \: x来源:CSDN
4 ? ?2 D- o- \- u( R C; p# H# w1 Y) u2 ~) Z: Q. m4 C, U! z
1 K, H* C7 o* _0 N7 F1 Y0 N
+ g9 i; v$ U) Q l9 ?6 g) t' N
|