数学建模社区-数学中国
标题: 2019第十届蓝桥杯B组决赛题解第九题 [打印本页]
作者: 杨利霞 时间: 2019-6-28 16:17
标题: 2019第十届蓝桥杯B组决赛题解第九题
2019第十届蓝桥杯B组决赛题解第九题
) {" _$ s# B, @/ Z, L y9 M* P
. y" |: }* ]2 E$ `7 b0 S题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0
思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
% n) m g4 g% Z4 c! y. b* f0 Y每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8( d+ P2 d" R+ `1 q6 R. k! p E! h
查询的时候返回含有8个值得list,并不断merge
代码:
$ v; m) P* o$ J* S6 K) h: g4 P
#include<bits/stdc++.h># e+ B" Y3 e8 G
#define mem(a,b) memset(a,b,sizeof(a))/ a) h0 F, \5 Z: D8 [% ]; c- `; {
using namespace std;* I" m3 ]$ w1 l: b& C, v
typedef long long ll;/ Z! n% q! }* t w! j! L
const int inf = 0x3f3f3f3f;3 ~+ n+ |' y- `6 t4 ^
const int maxn = 1e5+55555;
5 D) j! ~4 Y" E$ A( |const ll mod = 998244353;
6 E" e% A; n2 s# d1 Y1 }4 ~const double eps = 1e-7;" \( O3 p% x N" l1 e
/ `: E8 l- r& P/ ~; Ustruct tree {
$ h) @: Z' X! _ W9 f! I* _( t! e. A6 p int l,r;
( M. t, w8 T$ k int p[10];
! @+ I% s5 C. H, N! e8 a* x} t[maxn<<2];
- O9 f& Y3 j! |' j" U0 M2 p0 B0 D3 K: E/ z5 H* z' B2 J& O
int l,n;8 ` S5 E V$ J/ m2 K6 X- d
/ Z/ N2 H2 ^ }) F1 vvoid build(int i,int l,int r) {
( G( b- i% L3 y0 g/ w t.l = l;
b( b0 Q8 W J- o$ ` t.r = r;
q( _2 ?- i! @$ t mem(t.p,0);4 q5 [0 J* ?+ f
$ b6 C" j" \% D9 {6 q- S* W if(l == r) return ;: f& J, P9 j; `0 B' C1 |
int mid = (l+r)>>1;; V( x% P) ] c( m
build(i<<1,l,mid);2 L8 a/ L9 h1 u& m
build(i<<1|1,mid+1,r);
5 L0 c" j, S# ^ return ;+ \* \9 b2 R) \, S" A+ N4 W, L# L) B4 f
}
- _) w0 g; `, \" f. ^4 Y* L! x0 T( M8 u' Q% q9 {. D$ b) R
void update(int i) {
5 |/ O7 |+ h' G. d* t int cnt1 = 0,cnt2 = 0;1 O6 m# y, G8 f5 p
for(int j = 0;j< 8;j++) {& a/ W1 y. l3 Z) q* J
if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {- e1 T: I, k! H) d1 u& U( L
t.p[j] = t[i<<1].p[cnt1];4 @ m$ s. J- t% @" S |1 Q
cnt1++;; z% o e9 f% [- G( U: u
} else {; H' a9 I/ S f; e0 x# @
t.p[j] = t[i<<1|1].p[cnt2];
5 o) L! |2 J+ q4 w0 { cnt2++;8 }: {. |0 O1 c7 e. e5 b V
}
* P1 r& `8 A) }+ _ }; C2 l3 X" R" E# ~9 ?/ ^
return ;
7 o8 n! e5 b, Z4 x}
+ m0 U( {( v; _1 y: [4 k2 X n6 q) q3 r y! d* t
void modify(int i,int pos,int val) {9 Y: S' ~4 C7 _, b) k' E' K
if(t.l> pos || t.r< pos) return ;6 y8 w. p, U: u4 X; ?8 y
if(t.l == t.r) {$ h8 X, V _. ^9 l/ I( F$ t
t.p[0] = val;
+ U+ j2 l. Y- }3 Q1 ^# I1 v+ W% U return ;
" V$ B3 Z& X& g3 Q1 b }
3 o- E8 M- q4 t& E/ \8 @ modify(i<<1,pos,val);
4 r( J: |5 [, h4 U: M modify(i<<1|1,pos,val);% }8 f2 p7 G7 I% D
update(i);
/ e6 n$ G. C4 I" [3 D5 J return ;3 @* D+ e( `% l' C% L2 `9 `
}
- q5 f% U0 j! \/ D9 a2 r% _0 H! l5 S7 [
vector<int> merge(vector<int> ans1,vector<int> ans2) {* A0 y/ `8 m/ O& e# h
vector<int> ans;
$ w0 o E; k3 G! O int cnt1 = 0,cnt2 = 0;4 d `$ x2 r0 V& Z6 P' Z, q: Q* B
for(int j = 0;j< 8;j++) { V: j( m4 N7 g+ `/ ]
if(ans1[cnt1]> ans2[cnt2]) {
1 O, k9 p" C% y3 X( k ans.push_back(ans1[cnt1]);8 U4 d2 ]9 L+ Y
cnt1++;
1 E$ B; t |+ s7 R) ?8 B } else {& b f, V4 h! e
ans.push_back(ans2[cnt2]); b4 ?) P9 b3 o3 S5 y# p
cnt2++;
0 @' s$ l, C0 j }
0 c& w$ y2 A: k; A4 ^ _. M6 s }
1 D& }/ E( D! k+ z/ v. u& y' C return ans;
0 f. J# _) C. F}! s6 B9 l5 a9 B# a! j+ b
9 W t7 H& v' ^1 M) Xvector<int> query(int i,int l,int r) {
/ o- I) A7 Q8 R& w$ b+ x% t vector<int> ans; j# ^. x- P6 |. d* t+ K
if(t.l> r||t.r< l) {- R& q4 r$ J3 I8 V* o# k4 |! A
for(int j = 0;j< 8;j++) ans.push_back(0);% M4 o4 i6 f4 P% f1 |6 d
return ans;
7 H! r1 ]5 o4 T& ]0 Q: K0 T } V: Q; t. q4 w3 c
; J" r5 W2 h5 `, n0 g if(t.l>= l&&t.r<= r) {
9 W4 s& M* S0 \* a$ g9 l- H for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);
3 h; S* d4 ^. R. X: u2 c1 v$ q return ans;
$ p+ g+ T u5 z2 y }$ o& ?+ ]8 b1 c' x
8 [9 z u* {$ J- `" | return merge(query(i<<1,l,r),query(i<<1|1,l,r));4 v- t& l+ g% n! Z! [; U3 n
}
p. E2 d. S. Q5 |
' Z$ [7 E7 r/ v' j2 [$ Vint main() {& u$ X5 P* R( t- y5 E% X+ E
cin>>l>>n;
! V- W9 |3 r4 h8 G4 Z( t
! f. V) L V( J9 }' S4 d/ u- F build(1,1,l);
! _& g0 ]7 W7 C' L char c;/ z8 k" P1 ^8 U6 p
int x,y;- J" @9 {# n0 W: S( |. H! [
while(n--) {2 x- Z! g \9 n P4 y/ R0 k
scanf(" %c %d %d",&c,&x,&y);
6 u5 X v; F& u" ]" U if(c == 'C') {
0 w H9 x& I# e modify(1,x,y);
/ p: x0 D) l5 T$ b3 }" b& K/ a } else {
" q# L4 ~8 E" T0 c4 Z if(y-x+1< 8) {. R w q8 }5 _, W* X
printf("0\n");
( [, [* N9 c `' Y9 ?1 g continue;
) f5 V9 w, a+ ~% U }6 k' k8 p0 X! ?, n0 Q" m- ^3 R2 s
vector<int> ans = query(1,x,y);
5 h! N6 y% u) w- b9 Q: U! O! R printf("%d\n",ans[7]); w' g8 {& b3 \4 F7 I5 Q: M
}2 w! A2 s0 ?1 R- `# w: h
}
, `6 C+ k5 @6 g! B! r
$ ]6 t! f& y) {) Y& Y, F return 0;1 H7 Q( Q9 y, g2 G
}
( e# E r' ~3 Y$ j* i4 {9 i6 I; ~' E x# @3 |6 S$ m
---------------------
2 `& E7 ~: k. J6 t4 T. L作者:nka_kun 5 c6 f' P" S: e& \. e
来源:CSDN ) G' Z' _6 ]* J( j: V, o
6 c5 y3 u: [1 e0 C! b
) ?* a6 I' u2 F) L) X
% t% x0 q7 y1 ]. {; H2 |4 S
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |