2019第十届蓝桥杯B组决赛题解第九题5 A# x# q( M0 H7 T) i! S. q6 |6 e F
* ]; f$ t/ X* @1 b
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)/ h {! f; ?: d( o$ q
每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
4 i) `! }, l. L5 H( a查询的时候返回含有8个值得list,并不断merge 代码: ; W: x9 i( T! ]+ }% e/ X
#include<bits/stdc++.h>
: `6 J6 s$ n/ {0 y# k- B2 @4 A#define mem(a,b) memset(a,b,sizeof(a))6 u$ s( i8 e6 A4 E* |: C( r8 C
using namespace std;4 L& \9 f! W) l# O' z5 Q& V2 S* i
typedef long long ll;; y5 B+ j( T6 h! j$ |. p
const int inf = 0x3f3f3f3f;
& e6 ~5 m# `2 Lconst int maxn = 1e5+55555;
# i, B: N. E5 S) i( l+ Jconst ll mod = 998244353;
" z/ i# k& _1 b; Nconst double eps = 1e-7;
: b1 g4 W6 G3 ~: f! f3 [: a4 u5 g% Y) G8 q
struct tree {& {: Q' Q" C5 Y; [
int l,r;
* a( w5 r( Y- p# D6 e6 g int p[10];
; Q9 Z. x N7 z5 H" V6 M k2 e. I} t[maxn<<2];9 D+ \: {3 A4 `3 A$ f8 w: u
; Q3 p' o' v8 O' o u+ F
int l,n;
0 g. E1 T$ ]" ?5 x& P- y l
. h0 N3 Z( N" \$ @void build(int i,int l,int r) {
0 y& ] O+ I; \& }/ U t.l = l;
0 S( g( F2 N2 z& F t.r = r;
, D" W# @3 J6 Y. x8 `8 [, { mem(t.p,0);
x, _+ P j7 D6 W4 b) p
+ T$ \3 q; K! O2 e5 A5 s x if(l == r) return ;/ x( r- D6 g, n. ?! F
int mid = (l+r)>>1;6 {* [* j5 ]" X7 h# o& n
build(i<<1,l,mid);
3 g9 `) @( M" Y7 x# b% o+ G7 z7 v build(i<<1|1,mid+1,r);7 @* e( C5 p1 ]8 m
return ;0 e* [/ |, E& p6 ]1 T& k" V
}! G4 Q) C; }' w: y( o- k
7 i1 F6 N) U% q( X3 ovoid update(int i) {
3 f2 j& @" H W0 u; t @ int cnt1 = 0,cnt2 = 0;
6 l1 ]! q9 X$ K6 B9 \4 Y for(int j = 0;j< 8;j++) {
+ m. L! r$ f. L/ B if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {3 I: |4 [# D" W
t.p[j] = t[i<<1].p[cnt1];+ V/ B5 r# r3 |7 n( V6 m* C
cnt1++;3 H7 r% W; Y8 h- L$ E% a
} else {
' Q* c+ x; v8 Y t.p[j] = t[i<<1|1].p[cnt2];7 E, j# H* p3 H( @8 }2 b
cnt2++;8 a D0 r" e! T- [& [
}
2 ~3 Q9 P9 F) ], G, \ }% h7 C$ W5 G. P+ U* I1 l6 ?+ A5 _
return ;
5 d3 P7 S0 L* F3 O4 x2 }% p9 C}
' _6 b/ M5 q+ Y1 N
7 q- F4 @7 i `2 j H( Tvoid modify(int i,int pos,int val) {
8 A% F5 ~. S. \* ? if(t.l> pos || t.r< pos) return ;; ], Y: q( \- x9 g% z
if(t.l == t.r) {
2 b8 o, s) b, y2 r& t8 A t.p[0] = val;: J- R, L2 w1 [
return ;: p6 x4 B* z; n |1 W; m3 a
}
% V; X( O4 k( S v1 J0 G modify(i<<1,pos,val);& H! a7 Z! g- T' U4 v
modify(i<<1|1,pos,val);
3 s+ Y6 j$ j9 d; z& p9 Z update(i);
6 t F& `: [* b return ;
2 X# a1 Y$ Q% Q1 c% N$ R3 u9 _} K# r9 I, h1 P0 v
9 v, w) E' b4 b* g( U' f
vector<int> merge(vector<int> ans1,vector<int> ans2) {: R; t2 H8 L# S0 z
vector<int> ans;7 U3 V2 j# J j/ e
int cnt1 = 0,cnt2 = 0;/ ]$ c" P9 ]% S2 T; R1 T7 C* j8 s
for(int j = 0;j< 8;j++) {
0 h/ I. }2 O/ P8 H+ ?# I if(ans1[cnt1]> ans2[cnt2]) {( k1 E0 { q L/ W
ans.push_back(ans1[cnt1]);5 Z6 H/ T9 I8 @5 a7 a7 J3 N+ t
cnt1++;
; I6 }2 b" M$ i* I, T+ U } else {) y# j7 p$ i! a
ans.push_back(ans2[cnt2]);
/ N8 ` |5 F! l/ t, u cnt2++;
, M8 V8 i9 E' v; _9 ~; ~% N }+ d+ z% b: E4 I/ I: f0 v) n: O
}6 o8 X% | Z6 J) F4 {# O$ h
return ans;% h2 C5 N4 O6 w: o2 I3 j# i
}
' k: {' D ~# s" C% Y
4 N5 Z% C* z; V* a1 wvector<int> query(int i,int l,int r) {
0 \3 M; f. L- k- x. i: P vector<int> ans;
0 E& m6 N% d# i# i f5 A/ v6 O1 k) p" h if(t.l> r||t.r< l) {
5 o+ P+ X- S( W# q; ] for(int j = 0;j< 8;j++) ans.push_back(0);
& d( B: V. I+ |+ J. S b2 L0 e; D5 L0 n5 ^ return ans;
: z3 n2 y7 V$ g6 O* B1 Y+ `' [ }
& d+ t, X7 D6 w. h1 @4 R
$ b' r3 G- w3 z5 h if(t.l>= l&&t.r<= r) {
$ j C' M1 M4 d% F' t. t+ J6 h" c for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
. C, I5 n3 }& T. D+ _& o return ans;' a. I; d: ? B" w1 S
}
" q) W% h3 A* @. K; k9 `/ r. @+ q5 y. D( M4 D, M g( ?, V
return merge(query(i<<1,l,r),query(i<<1|1,l,r));
3 [# N- X) X* @/ K9 ?8 w( Y}
$ g& G; E/ a5 H7 F7 l
( t+ w& @0 a3 ]1 [" _! sint main() {: n% g3 Z" z* v" p* N, T; I
cin>>l>>n;7 Y- m6 U. M7 g: D8 s7 V5 M" V! s$ W
' f& k$ t9 o- U" Q+ j5 j) F build(1,1,l);
$ |, O# f6 R) D char c;% g* s: S1 z! {( M3 }7 i& {4 @' V1 q8 P
int x,y;
: \, \3 k% X7 [* z4 b/ j g! [ while(n--) {
( i: A7 _3 A* u; }+ l+ | scanf(" %c %d %d",&c,&x,&y);
. t2 B2 Y8 l; P* Q1 l7 g5 i2 V; g if(c == 'C') {! ]6 F: E' A9 U% ^
modify(1,x,y);
- m; u2 i7 n Y; M8 q8 A( A } else {
- e5 z" d# W0 f* S if(y-x+1< 8) {
$ e, _8 @+ _+ h1 x* b4 ~2 R printf("0\n");
2 c- ]) T9 a& a) L continue;
. N& E- ?) f+ o* h; y- P }
5 W/ u! h# ]3 W0 ^ vector<int> ans = query(1,x,y);# s/ ^" D; X4 l* z, `0 Q* q( l
printf("%d\n",ans[7]);
0 M. s2 e, z' M }4 L+ A# h, |7 b/ ]
}
& P2 z6 b( O7 E0 H$ k/ X/ u# [3 ^
0 @1 n4 ~* |# S return 0;
6 n+ g0 E/ L/ n$ e) A6 p4 f* N. ]}; u5 d" k# g6 p. t0 [+ f
+ Z4 Z3 Z/ K8 @* Q* `! o2 O---------------------
" T6 f! [, J# p% J作者:nka_kun
3 u7 }6 E! e( k' V& g% G来源:CSDN 0 W$ c3 k& t5 s5 M. D
4 w0 ]6 O6 w# ~1 }3 @) A& W0 r- {
! R- ~/ t. I2 o+ o2 W/ C
6 `3 i1 r" I/ b% X" { |