数学建模社区-数学中国
标题: 2019第十届蓝桥杯B组决赛题解第九题 [打印本页]
作者: 杨利霞 时间: 2019-6-28 16:17
标题: 2019第十届蓝桥杯B组决赛题解第九题
2019第十届蓝桥杯B组决赛题解第九题! U Y9 r5 m1 J7 o+ a6 t
$ y m) Q, W1 n; o% L# I题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0
思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
% E% K4 r( z" R( O) N3 [$ u0 L每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8& g8 c8 n; ]$ z' Y$ J4 n! a
查询的时候返回含有8个值得list,并不断merge
代码:
O( g& s6 j3 v( ~
#include<bits/stdc++.h>
Y" r) Y* \. O' q O#define mem(a,b) memset(a,b,sizeof(a))
9 b% Z/ F; g5 m; D3 w' d6 t/ ?; eusing namespace std;
. J" t4 Y' S& f0 Ytypedef long long ll;
, Q. y7 P) X! W( B' w4 L9 nconst int inf = 0x3f3f3f3f;
; G1 u. c# h4 K; {const int maxn = 1e5+55555;
6 ^6 C- k+ {; fconst ll mod = 998244353;
7 y9 l5 i$ D7 R+ N0 ^9 Tconst double eps = 1e-7;7 N( S. q! N" f% C$ D/ F
% |0 ~% ~9 a9 x+ S9 z8 H; T- N
struct tree {
' ~2 e/ V9 C8 {' @2 L- | int l,r;- [9 L1 E) {% z* E8 E& S& e
int p[10];
- Z6 l$ x7 ~" }# C} t[maxn<<2];% G. N |) y. J: ]! m2 F! a
5 w" g- B& M2 B: H5 H% _int l,n;4 k4 {5 U- Z8 y/ i3 w
- D/ L. I9 S: u' H1 ^
void build(int i,int l,int r) {2 N8 p& R- j( Y8 B
t.l = l;- S8 O) Z1 k0 A+ e$ X
t.r = r;6 Y# d3 B7 N! P( _$ m' K
mem(t.p,0);4 m: j I0 R' X* t. K# S* G
7 `6 @ S o, a) P. p# e/ [9 T2 x if(l == r) return ;% s% @2 y* j9 R+ S! n" u6 r6 Q* ~( P
int mid = (l+r)>>1;
A/ L, ^0 o g$ G' l( P! i6 E build(i<<1,l,mid);5 m5 D+ ^" p9 X! z# j( M
build(i<<1|1,mid+1,r);
, w2 }. ^# T1 Z) q. e- W1 f6 G" j return ;
: h' m$ r" x! n$ v: }- `}
/ s0 \' J! P$ c: e3 J6 V0 C: ?/ W% }8 ~* r* }/ X+ j
void update(int i) {0 T8 N& @) S) W Z
int cnt1 = 0,cnt2 = 0;
1 J( O) ]$ m7 a: k) P for(int j = 0;j< 8;j++) {
5 k& f& @1 R" y, Q! f. B H if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {) w/ _! _: M0 D( y# m0 l
t.p[j] = t[i<<1].p[cnt1];* s6 W; l+ c, o; ~
cnt1++;9 i' Q( Y! F* K/ @ k" _. O
} else {7 C g% y2 q$ U( u* _1 v. I
t.p[j] = t[i<<1|1].p[cnt2];& F+ }; q+ k3 D' y1 }$ g
cnt2++;; s$ b5 W- q. X
}
+ C4 X0 k# m4 R! R0 N6 A& S' _ }$ e, k1 y2 B. s0 Z$ Q! c8 e
return ;4 [' o5 K/ ]) V- z+ U
}
- l# s- v) l; ^8 U Z
: P) E9 H1 \, F9 l+ ]void modify(int i,int pos,int val) {1 X* Q; r! h( \' |2 x0 i6 L
if(t.l> pos || t.r< pos) return ;* A( A. x. k1 \6 l3 b3 J1 R
if(t.l == t.r) {
% y v4 Y6 d, ?8 u" m# N$ ^ t.p[0] = val;1 f8 ?+ Z) I' z; e$ C8 _' [% I; ~
return ;* q* [/ w: W& k: l1 U: X; V" u
}
' B/ a/ y" J) T2 U- y/ f$ ]7 s% R$ L modify(i<<1,pos,val);
- u* j, l, l6 ~0 i, K modify(i<<1|1,pos,val);
6 u @) R! i+ w& ^: |* u3 a update(i);% Y* s# \7 [; }. P9 w$ |& f
return ;
+ ]& M' L2 S% C6 `' n6 u}: W4 i& N9 J f
- h0 |6 f- p% G* v8 x0 ?
vector<int> merge(vector<int> ans1,vector<int> ans2) {
0 \$ o# |+ D7 e; Q vector<int> ans;
- U. \: [ Q! I int cnt1 = 0,cnt2 = 0;
. [2 }, V; T3 l9 n6 F for(int j = 0;j< 8;j++) {
+ J- h6 u6 u, L' a if(ans1[cnt1]> ans2[cnt2]) {
3 J) |4 f6 Z7 U2 k, T( k4 O! Z ans.push_back(ans1[cnt1]);# Q8 g( m4 X. _# ^ b
cnt1++;& N% p' t$ y+ g0 Z" I$ b A
} else {
1 p7 T- u% r) t$ M+ Y ans.push_back(ans2[cnt2]);
; f2 Z5 F) h& }2 q* I3 e7 y* A cnt2++;
9 C) W* V( n! p4 X$ k }
4 o8 ?; l, S6 x5 z& B }
5 \7 Y7 G2 o7 U return ans;
* _" X9 J/ H+ |& F, M0 s- ^3 A5 q}' I! i( _) ?: s5 o
8 a [ Q, _/ G8 x) b- }
vector<int> query(int i,int l,int r) {
. h6 r7 [/ J/ \0 v5 d9 x+ n3 h vector<int> ans;0 t6 p! E, b) m
if(t.l> r||t.r< l) {
1 U( {* A& X, @9 A for(int j = 0;j< 8;j++) ans.push_back(0);
, [( j4 y! G0 g' q return ans;
6 c0 F8 {" g. H9 M6 {3 N0 i }
0 H% t+ M U! Z. C0 _" E1 |
: y% }6 N! a2 r' G/ R. J if(t.l>= l&&t.r<= r) {7 Z2 G& E! z$ [, {3 ?; E
for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);3 O1 E0 t; v# Y2 S( t1 E" P
return ans;$ d5 m% R* E. T4 l
}
2 ?7 D$ m' q" O- G6 p" Q2 Q: Q6 r( ]
6 T6 U, V' `# i/ ]0 M( f' ] return merge(query(i<<1,l,r),query(i<<1|1,l,r));
4 R b5 C( B" o5 \8 e+ V+ i- i# ^ L}9 d4 f. _% M6 J- \# k9 P
* u6 n6 G* Q5 ?. R+ P5 Q$ s5 v
int main() {
7 u& ?- Z/ {( u9 C cin>>l>>n;5 F& ~. ~* ?! Q: L& y. K' p7 R; x
0 A8 ?4 |3 c; P t. }0 }1 \$ r; M build(1,1,l);
/ h% ]( x) U9 ?4 [; `9 T. Y; ]2 i char c;/ {' L0 l" a& @
int x,y;
; E( i* x, W) ?: J! A9 p6 {6 J while(n--) {
& ? E, N' x, T7 A6 b scanf(" %c %d %d",&c,&x,&y);
- \& R4 P" g! ^4 u% D if(c == 'C') {. H+ f8 k% F# m, ~. O: |
modify(1,x,y);
% f% g w0 E `. E! G } else {
' p( N5 Z$ {5 V( k if(y-x+1< 8) {2 O# ~1 z2 r7 ^" h: Y
printf("0\n");9 P5 Y: h0 e6 ^, d4 S5 P
continue;$ I y8 h, z& c2 m. Q
}! E9 r5 O, Q9 R/ Z
vector<int> ans = query(1,x,y);' X! B3 I6 L. U4 l% I" n4 i9 n! A
printf("%d\n",ans[7]);7 B0 v7 O* v1 b5 v8 e* ~: Q: {3 _( D
}. L; L- X: V4 ^2 y( X
}4 U% p. j5 ^ M& M+ o# K9 _
- P6 W- D7 _6 o# J9 P: \ return 0;2 y+ p; x2 F& G5 @/ z }1 ] }3 s+ W
}- W" k% C E. Y1 Q1 @- T/ I" t3 e1 {
9 G: E" ?4 q- ~% @' S
---------------------
, ?* G. d: N/ ]/ T& s作者:nka_kun # u1 R9 c1 u* L, P
来源:CSDN 5 K$ W3 M/ w# @2 X# S
6 S; h5 i! d- h1 H7 V
; k1 T- Z7 B3 M; s. u
2 I$ L6 g" m9 q' G8 H d U# |& k# k
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |