2019第十届蓝桥杯B组决赛题解第九题
. k) c) \. W& H# P! P, u6 e
& c! ^; H8 C# J: m8 t$ W7 E0 p/ l题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)) V* v0 ^: q2 N7 {
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
( f/ X0 J4 r$ K& e# E+ t$ R查询的时候返回含有8个值得list,并不断merge 代码: 1 V# K6 |5 Y( Z' T4 a
#include<bits/stdc++.h>
9 g7 F& \* U/ |6 h#define mem(a,b) memset(a,b,sizeof(a))7 v S* _* u9 u9 ^3 n6 v
using namespace std;
* o+ m: @8 a% c- E: t/ Y7 C; ~. ytypedef long long ll;& F! `0 S/ M3 x. z0 L7 _1 }
const int inf = 0x3f3f3f3f;% Z: W/ b3 U8 s; V. u( q2 ^5 D' Q
const int maxn = 1e5+55555;1 `% t6 @3 f: z; H: p* }) t
const ll mod = 998244353;
) }0 x3 l( ~# l6 Dconst double eps = 1e-7;
+ C- q9 Q. m3 H+ H$ M
( r( g- }% w9 z: [2 |, T0 estruct tree {9 c4 V5 z) a8 V% E" o: a& \: C
int l,r;
2 J( r" j! u0 x# m; D9 @ J int p[10];
3 _% L0 G9 p) N. d- Z* I# I} t[maxn<<2];9 v; U2 t, e& ^& ~7 ~
! n% N, O* [. U6 h) Eint l,n;; _) L( u! g3 E% z a0 ^2 z: v
( K9 v8 }7 z" V% O+ K3 K: rvoid build(int i,int l,int r) {
; E( u! i5 M$ q t.l = l;" ~! |& V# O6 m1 H
t.r = r;, z! g' U: \3 \0 t
mem(t.p,0);8 X% ^! T, L" r! F2 W
5 K8 ~8 V0 T; @6 l& L2 B* S
if(l == r) return ;
+ Z( S8 e3 F) t+ b% J int mid = (l+r)>>1;
: L+ a& M- R' u* h; f% K) i build(i<<1,l,mid);
1 O! o. j2 h2 {/ ~2 D: W build(i<<1|1,mid+1,r);7 T* U2 @1 v5 q7 @. K
return ;$ j4 z5 b5 `6 u
}6 C" [8 i$ d9 w9 U+ [7 q g
( P, ] o6 ~/ K! Xvoid update(int i) {7 |4 ^5 y! X! K: U& p( l" Y0 |
int cnt1 = 0,cnt2 = 0;
' z" ]$ C0 k2 P5 P7 H for(int j = 0;j< 8;j++) {0 v% [6 u7 L C0 x, d+ D: B1 `
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
: ~7 Q0 g& a* k9 A4 U! c- | t.p[j] = t[i<<1].p[cnt1];
/ V. ~$ R2 U! D cnt1++;: Y. D2 D# Z; f) `7 _- u+ [
} else {& U( g+ a: E+ F, v
t.p[j] = t[i<<1|1].p[cnt2];: h3 x2 L' j' J! e; d0 ^
cnt2++;0 b* d% t q c7 [" P" M
}
) v' w3 y3 a* N# O! n. T6 ~ }
8 A/ v0 B/ n* { return ;/ Y( y& d9 ]* K: r# S( B$ ]
}( L$ H$ @; m1 ?
/ D F! r) f7 ^8 d) @void modify(int i,int pos,int val) { k2 E, k* U, W9 d
if(t.l> pos || t.r< pos) return ;
6 e4 p4 X8 n& o, F9 ~% h4 z/ v! O% y if(t.l == t.r) {
5 g1 \+ Q6 K. N! B t.p[0] = val;
+ \6 k% Q/ S+ j0 ?) K { P return ;( k6 e2 f0 R+ n* ^2 w4 n! |6 A
}
6 x$ V3 | s" g/ ]* a$ W7 b: z modify(i<<1,pos,val);+ j& e; K( S7 e T% `5 E8 u
modify(i<<1|1,pos,val);5 U" g9 h+ P# ^; S# P0 a4 ^: ^
update(i);6 K& Z8 H5 o" c. ]! A
return ;6 D) F N5 g& C1 w7 F0 o& S% H9 `+ J
}' @; a# t9 X0 A! ?- z/ S
: a" v1 B( _# _1 [
vector<int> merge(vector<int> ans1,vector<int> ans2) {. F9 S) R, v( z% G! f# M# {$ f- c
vector<int> ans;: K; A$ c- _' f+ m# q. @
int cnt1 = 0,cnt2 = 0;
- V0 M1 Z6 V" e& G& G. J for(int j = 0;j< 8;j++) {
5 l7 U9 }. {* m! X if(ans1[cnt1]> ans2[cnt2]) {. S3 C2 U, `6 n6 \. T
ans.push_back(ans1[cnt1]);8 \( S. H6 U( O8 L, S# s* T
cnt1++;3 O3 |+ e5 R; j' K- q6 ^$ {
} else {
4 R1 T) _4 _* [ t- w ans.push_back(ans2[cnt2]);
0 j8 X3 a: S8 J# V2 o# J: c2 J- P$ ~ cnt2++;5 Q# o, H/ s. X3 b/ o$ o3 j' W3 @& q
}
4 |1 y9 r- n7 w4 N8 s: i( i }
* S6 t$ i1 D g8 D return ans;
' f) L) ]. e G* f}6 {& d' A( {3 u4 o
7 z! W N9 ~ A- N ?
vector<int> query(int i,int l,int r) {! I, m' f& h A, A: R
vector<int> ans;
8 E; F) P+ A, t) `' e7 A if(t.l> r||t.r< l) {
6 i0 l3 n( b: m" j for(int j = 0;j< 8;j++) ans.push_back(0);3 x, D& T7 O9 W( P
return ans; y/ v, V/ R9 T
}, D$ a3 y7 l1 ~" k
+ t# I4 ?6 e v8 S1 G3 j
if(t.l>= l&&t.r<= r) {
3 a& J; `- i4 W) {5 \8 s for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);; p0 e- G+ _" X/ {; I0 R3 h1 [
return ans;
- V5 ?, a* `- y" b3 K( d }
( y- q3 h% o/ h, c* i8 }1 T
1 `6 m$ u1 p; N& V& K' L2 ^ Q return merge(query(i<<1,l,r),query(i<<1|1,l,r));" C6 }$ ]( [) T4 o
}
( M4 z, ^( ? W5 f! N6 W* {6 y6 ^: I) X' w: U
int main() {# w. a: E' J" J1 @
cin>>l>>n;: X- X# E+ c) v) o# v
- ~! \ C4 } E
build(1,1,l);
# O9 k! w' R8 c! b' {; ~6 l char c;. [4 m8 }0 N& U5 p5 @! L
int x,y;% F$ |$ @/ d/ b P. ~) s7 B
while(n--) {6 h }. H: r& T: l$ V
scanf(" %c %d %d",&c,&x,&y);1 }5 |3 x- q; D {$ r* K
if(c == 'C') { q: b- l9 q8 Z
modify(1,x,y);5 m' W0 o( L& v" n# [' W! `
} else {
! i+ Z" _( ]8 | z5 B# h if(y-x+1< 8) {1 }" s0 \0 n9 g+ x
printf("0\n");
( |3 s1 k8 p& I8 b continue;
9 V q6 t- `$ S0 M }
3 j, ~2 z8 {) t5 v( K, A4 K* J vector<int> ans = query(1,x,y);- c: B! y& p# q* J
printf("%d\n",ans[7]);
% j! n2 w) C4 B6 L }
, l/ ~* R3 v, @+ Q3 b6 L% m }6 X5 G6 \1 h) C( C( J9 P
: M7 h2 L, a3 N d, A o9 P" B return 0; t- y+ F) P) v9 t0 v
}
" m! [7 n# v) ~# A) u" s6 ?2 U$ N* k+ L5 m
--------------------- 5 }$ `7 S/ J% B( w0 P
作者:nka_kun
( M, d3 X" D8 z9 z- E; u来源:CSDN
, L! l8 Y- B( z% ~: H d/ b) x0 F# {4 J* ^( G7 Q- b3 D; o
7 E6 Q3 y' z: x: M7 A7 T9 ~9 N! O1 P
% ~2 u* @0 E' a4 N3 U0 N& Y; [. G |