数学建模社区-数学中国

标题: 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