2019第十届蓝桥杯B组决赛题解第九题4 B& Z0 g$ w w x9 |
' K* O' @: j2 i0 n9 x. `: K# t" Q
题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0 思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
5 _: Y4 h% h$ a3 c' r. o+ y每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
9 m( l4 o9 o" _' h& _查询的时候返回含有8个值得list,并不断merge 代码:
5 w" I- \- d& O5 W9 F" E' s#include<bits/stdc++.h>
$ ^7 A& ~2 H) a. |7 O1 I#define mem(a,b) memset(a,b,sizeof(a))
7 @9 q+ X, G8 v; Q) [/ J2 v1 ^$ Cusing namespace std;
0 f& c: H" B% ^6 P' t4 I1 `* Ttypedef long long ll;* O* h8 X9 L- ~0 |( c/ @, N, R5 ]
const int inf = 0x3f3f3f3f;
* u" N2 _. m/ F" D' ?0 Y5 _const int maxn = 1e5+55555;
: f3 a: K! S) j: u' o1 aconst ll mod = 998244353;
, b9 R4 u) }( F: s7 G' G3 Dconst double eps = 1e-7;& X6 O( n3 ^6 \. _. `
& ]: y4 ~1 _+ ` T- K) ^struct tree {+ c0 Q8 ^( S7 X7 ?7 [0 g, Y& V
int l,r;, a, C( o: R' _, S q- S
int p[10];
# O! ]7 Y/ D0 z7 f0 ?} t[maxn<<2];9 _6 @2 g- I0 s( j0 g1 p; T
R# `/ `3 n9 v5 N( N( q [int l,n;- C8 p6 W& Y7 i/ y6 ^. H/ }
# O' s: A7 R. [9 I/ T+ F" C1 P8 Mvoid build(int i,int l,int r) {
/ K( m, u7 P3 N; V2 w! ] t.l = l;
. E5 A( a6 l6 d, G" Q t.r = r;
: {8 W; w1 v7 a1 C mem(t.p,0);$ V9 c& e- X. e5 @+ {8 }( d9 v, \
/ x2 ]9 m7 k+ Y1 E G
if(l == r) return ;
4 n. S$ y, m9 k, i int mid = (l+r)>>1;' g4 w' Q0 }( u9 t: [
build(i<<1,l,mid);
) r, ?9 x0 \2 n build(i<<1|1,mid+1,r);% ^) ]; _) I5 F& X! O
return ;
, w7 i ^4 V; f6 {1 ]* Z}' ]' G- ]5 O( U8 e5 z" k3 q$ M
9 @- z% H+ |& F$ Z5 Z% E1 n
void update(int i) {% s1 W6 t. |# m3 x
int cnt1 = 0,cnt2 = 0;/ O* \5 e$ v- C. z
for(int j = 0;j< 8;j++) {
# E5 k* L1 u2 `7 i* p if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
/ G, o3 x; b, t* ~6 W t.p[j] = t[i<<1].p[cnt1];
& E, @7 E; O: u; \. V7 X; C cnt1++;
8 h: b, C7 W/ m- L } else {
) x& K2 g( O) v3 V; @& `0 \5 j t.p[j] = t[i<<1|1].p[cnt2];9 f$ p2 z6 P- Q/ w% T e
cnt2++;5 ?0 R6 p# r; n: j y
}
' l+ M! R' r V5 h }
6 @0 R8 i: Y2 C) e$ f$ N, w8 n return ;
8 L- [1 H& ^( |+ o$ d" U}
8 c6 H+ r) J6 A3 V2 B3 V, X S1 W. H2 }1 q7 X
void modify(int i,int pos,int val) {, Z4 x& J7 m' z3 u
if(t.l> pos || t.r< pos) return ;
# O# Y: v6 i+ n# B if(t.l == t.r) {& \8 u9 y+ \; n" V
t.p[0] = val;
3 o% _2 ]: a- ]3 X& O) ? return ;! S1 C( X" c# K8 r2 k% Q3 ?& t% n
}1 |' g. w* [4 ]/ f
modify(i<<1,pos,val);) \' L" `; d- ?3 d& H
modify(i<<1|1,pos,val);* A# J) b: c; \; r
update(i);
2 l; _1 P/ E! S1 v6 j return ;7 _; w' z5 G: C$ R% H
}
4 @ E4 K9 ]2 z1 P$ t
6 B# e& W1 _/ H% j9 V. g5 lvector<int> merge(vector<int> ans1,vector<int> ans2) {: d, X# a. q4 T7 w9 [8 Y8 k
vector<int> ans;# y: Y2 n+ g6 `% P, |5 J _, [
int cnt1 = 0,cnt2 = 0;( o5 ? P: W+ l+ `" P5 _
for(int j = 0;j< 8;j++) {. L3 M6 N% Z* d) o. u7 c
if(ans1[cnt1]> ans2[cnt2]) {
* u: }$ T; F* X% A7 s) k ans.push_back(ans1[cnt1]);5 ^! m, [/ x, T9 @. b Y/ u
cnt1++;- \% F& a, ~# F) x& }
} else {
. l: U2 d d" L5 Y2 G% R! Y% y# u ans.push_back(ans2[cnt2]);8 u8 ^! Y( x) K, c3 C
cnt2++;
( i: o- f+ R K; e0 K0 H }
% R6 C A* ~% _) u# H- q' E" [ }9 e. l. n8 ^% N* m
return ans;
1 F: I) J) M- }: q* {7 l}
' a2 l1 J! K9 v; l8 I1 b) e2 l% y0 L& @9 h+ m
vector<int> query(int i,int l,int r) {+ j4 ?/ W* U9 O) Q0 f7 s
vector<int> ans;
7 f* E, R$ D" e, Q0 ^ if(t.l> r||t.r< l) {
H* e$ M; y( o3 w. F for(int j = 0;j< 8;j++) ans.push_back(0);
$ t) t+ E( [) P: L$ S, | return ans;7 ] l( j' J1 U0 F0 F$ R* X8 ?
}6 l+ g, J6 Q2 Q$ a7 c' E8 S
: z/ I4 j2 v- L) E if(t.l>= l&&t.r<= r) {
+ U2 ?1 n( W; m) G for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);1 ^6 j2 m3 D/ _5 a% Z# y5 g% y
return ans;
" _) ?; j( z6 {5 a$ N }" n+ b! ^% b7 k4 R" F
. f4 F& I9 `3 O1 r5 E1 Y return merge(query(i<<1,l,r),query(i<<1|1,l,r));
8 k3 i/ c( [- e* b2 U- h: c2 b7 ~, E}+ b9 v1 t% w3 b7 j6 P# D& ~
0 V8 [' G/ ]+ F2 p+ c. Lint main() {& B! t( H4 `% G
cin>>l>>n;
0 q, p3 f, d& h' a
) _% x2 o& M' X4 E3 D& V build(1,1,l);
1 F4 ~/ b, h: I( [& @- n9 v char c;
8 X ^0 B9 j$ R0 j. Z int x,y;
+ B) C1 Q5 Q6 F* Z ^" X while(n--) {
# t' l/ u( O" b scanf(" %c %d %d",&c,&x,&y);( A$ V* a& ^! O3 D3 U2 |
if(c == 'C') {
6 X3 @% Q b( ]' x- P, u2 q6 U modify(1,x,y);
+ L" ]' n5 n" Y' }6 K- } } else {
; ?# z* d+ I& B l if(y-x+1< 8) {' k0 s; Z9 q4 W+ H a8 r
printf("0\n");9 k) v# m+ ]3 a' _! e! `( o& T1 b
continue;
7 U. [) Z7 f/ e; D. ~# h }
. {- }0 ~6 `) e# l- j7 ]8 l+ W vector<int> ans = query(1,x,y);
$ S, e3 Y J/ D$ ?! v printf("%d\n",ans[7]);& e+ E0 l% N5 w4 ]2 e
}& N8 K" ~; l) q* N7 d1 `
}* l$ _) l4 W& P4 f; A% |
" H% `9 O5 U. j; e$ N return 0;
6 I4 s$ ?6 A9 o3 x% R}
2 I) _) ~4 n( \4 n" |# M/ v$ s' G7 l* L+ P
--------------------- 6 G) ?+ {5 [$ }6 L
作者:nka_kun - e* A0 @6 d9 [2 u; O6 ~, _$ {
来源:CSDN $ Y8 U* F# V0 A8 b4 V* J, }- z
# ?" e% g! h: L- f1 A, C2 l) x# C' B$ d0 Z9 b6 P: b" T% H' K0 J
7 E+ c3 P) F/ E" v |