数学建模社区-数学中国

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