数学建模社区-数学中国

标题: 2019第十届蓝桥杯B组决赛题解第九题 [打印本页]

作者: 杨利霞    时间: 2019-6-28 16:17
标题: 2019第十届蓝桥杯B组决赛题解第九题
2019第十届蓝桥杯B组决赛题解第九题
0 j4 [2 [" f& M# C0 T9 D  p/ S/ i. c6 N. v! T

题意: 两种操作,C x y,将x位置的数修改为y,Q x y,查询[x,y]之间的第8大值,y-x+1<= 8的话输出0

思路: 区间第8大值,线段树在时间、空间都够了(蓝桥怎么会让手写主席树。。)
. h. ]0 ]( i  D; ]$ ?0 P3 a: G9 |每个节点存储它管辖的这个区间的前8大值,修改的时候暴力merge,单次修改复杂度log(n)*8
# t5 J+ J- w1 Q" d1 @& {' D查询的时候返回含有8个值得list,并不断merge

代码:


# Q: d. A% S8 T6 u2 z2 P+ r, \& C#include<bits/stdc++.h>
$ o. J% x/ ^: B3 m$ e5 V- q" O#define mem(a,b) memset(a,b,sizeof(a))
  }" r" x! [+ V0 w7 O- s1 H; Qusing namespace std;% M0 s" @0 m2 j& p$ H' l! q
typedef long long ll;5 f( m! P" p9 R' d2 a. T0 N# J/ j
const int inf = 0x3f3f3f3f;
8 r0 A4 i" [; U( Rconst int maxn = 1e5+55555;
% _: U3 s: w" _( ?0 G4 I  Oconst ll mod = 998244353;4 E% w$ \. h+ d8 F  z+ e* N
const double eps = 1e-7;+ ?5 N% b  z8 k- |4 [( c7 ^

# u! h5 U+ m0 I' L- V' xstruct tree {
% X+ z  R- l! E+ _0 A    int l,r;& ^! l- \" A2 V0 N$ k
    int p[10];
8 ~1 @7 [8 i6 g% ]# l! `+ d} t[maxn<<2];2 `; L/ v2 O. i/ I- S- v

$ o- G/ a/ p3 \% Nint l,n;: Q/ ], W! x+ I9 A2 u% A
/ C( `& G! a" i
void build(int i,int l,int r) {# J' \. e2 e" v# j& C/ C& j
    t.l = l;& q6 `( Z/ ?8 R6 _6 P
    t.r = r;1 |( s8 J& j& g& J: g
    mem(t.p,0);5 W& c+ i1 X2 O  k+ c$ M% }2 F

/ D" \4 `  ]( |2 Q; h$ C5 a' D    if(l == r) return ;% ^) i/ _6 B( k+ C+ E9 Y. S
    int mid = (l+r)>>1;
8 T$ o" T/ Z0 X3 ?7 j8 e    build(i<<1,l,mid);
  j8 M( Z% a6 \$ f    build(i<<1|1,mid+1,r);
. p6 b* b- R8 u2 c/ e  n' x    return ;) g3 l& b# d7 m4 O8 R
}
+ v3 Q, Z5 u" u/ v0 M) G, r9 A: X/ O$ N8 c  S
void update(int i) {
& C  P( W- X, C, I4 y# s$ D4 r; W    int cnt1 = 0,cnt2 = 0;
2 G$ k/ }0 h2 F* u    for(int j = 0;j< 8;j++) {& z' j' E# e* C
        if(t[i<<1].p[cnt1]> t[i<<1|1].p[cnt2]) {
  }9 C, R- N  r0 e; r( c2 ]6 D            t.p[j] = t[i<<1].p[cnt1];
! U6 Q! O8 Z  w4 n1 q' ^            cnt1++;
& F+ J3 v+ ^) P9 B        } else {
; X! V% f* _9 v            t.p[j] = t[i<<1|1].p[cnt2];2 O* W" |8 t% u2 G( V
            cnt2++;
# p& B& ~" Y+ R% |% j: D: o+ V8 j        }
3 j: r8 g$ g0 v+ }    }
# j/ C7 Z  A* W: v& s1 L    return ;; @4 w, j9 G, q8 ~: Y/ z. R
}
0 Q4 c) M6 \" a$ S7 {9 S4 R' ~' N8 u0 d# z. N/ B
void modify(int i,int pos,int val) {; m6 L- u8 E0 u9 }4 B) O7 F
    if(t.l> pos || t.r< pos) return ;! S* N! l, Z' V* Q
    if(t.l == t.r) {
* t6 `( l: u$ G) M        t.p[0] = val;
1 e6 c0 ^% |1 I% k7 N        return ;: A1 p: F* \. i2 {+ Z
    }
! z- g, R. N8 c; q6 j    modify(i<<1,pos,val);1 w* D! l4 Q, U7 ]- h1 a3 I
    modify(i<<1|1,pos,val);$ E3 q* w8 R. J/ v& U
    update(i);- E; d9 p* E' z" O
    return ;
! k0 j$ V( \" x# f( L7 V}
$ W/ Y0 e/ i  m! V9 h0 [  B9 m7 d2 r7 _. y9 p. [
vector<int> merge(vector<int> ans1,vector<int> ans2) {( Z1 J, j' f) Z5 B: t. R
    vector<int> ans;& Q* d+ N6 {' C9 h! N# F
    int cnt1 = 0,cnt2 = 0;
6 K0 S. D: @: T  [    for(int j = 0;j< 8;j++) {
+ j2 o) z- A/ C" A/ h+ W        if(ans1[cnt1]> ans2[cnt2]) {
. U" N( U6 z4 ]& P6 q  C            ans.push_back(ans1[cnt1]);0 l4 T% J8 @% ?
            cnt1++;
4 [7 g& n+ m' L! U  j1 C        } else {
) q% H1 `. s6 t. l9 T            ans.push_back(ans2[cnt2]);
. d, M, K2 d4 Z. E8 I# P            cnt2++;
2 z% v; Z1 i4 U& b1 X: B3 f& W        }) o# o% W: y! W9 e1 Z
    }6 j; Q  d$ d7 w9 c
    return ans;
7 y, a% r) _' @9 e- J" F4 J. W}0 u) B# Q( F" n- s( X

9 g7 w5 Y1 t1 f1 ]# \vector<int> query(int i,int l,int r) {
% k* `2 m1 X* A    vector<int> ans;
! L& [& r" I/ Y+ s# ?2 R    if(t.l> r||t.r< l) {+ t! Y* p( p7 |. F" c
        for(int j = 0;j< 8;j++) ans.push_back(0);
& H2 q- z8 z% c  t( S# H) v        return ans;
4 b/ K  {- Y* u: M  o; G3 @    }
& m) J1 d1 x8 j2 s$ A+ Y& H+ X
/ R. ~: c2 L& k2 u4 i4 b    if(t.l>= l&&t.r<= r) {
6 X4 _4 d& N  z  T; ?& K/ a        for(int j = 0;j< 8;j++) ans.push_back(t.p[j]);' N6 s$ c: E  r# ~& K
        return ans;
3 O* j$ j7 N2 P* p: V& [    }; i! a1 ], G/ D1 h; d
- `( y2 i9 b, I* V( S2 P
    return merge(query(i<<1,l,r),query(i<<1|1,l,r));% |( K+ j& m- M# f, `
}
% B- y0 ]* O8 X7 O1 v. J) d( f/ Q: [1 l6 A9 f
int main() {3 L) a9 c1 L4 \& \5 L3 l. h% H6 K
    cin>>l>>n;
0 `, E! S" C* d
4 D' a, O, D1 A( o) G$ a# J    build(1,1,l);
8 ?" A2 x2 N$ m- P& m$ N0 b/ o    char c;
, Y' q6 |& ]! M  y" k, o    int x,y;5 f, b0 C; q+ M" c$ x
    while(n--) {
7 |0 e( N+ j% W& j. T        scanf(" %c %d %d",&c,&x,&y);2 K3 M! U) I6 V; J2 @& b8 Q
        if(c == 'C') {. Q+ b9 ]/ s- T; V( B
            modify(1,x,y);
% ^+ `' A% l+ D1 I. @! O        } else {0 K& g6 B& }. E3 h* @
            if(y-x+1< 8) {
5 k5 `* p2 b! V2 b* Z                printf("0\n");
' v' M1 G, |% W! q) ~                continue;
8 m1 @' J& N8 `            }2 D% l% d: R* u' R
            vector<int> ans = query(1,x,y);
; ~* b' ~& d& n. U7 j            printf("%d\n",ans[7]);9 ~( _/ B0 e8 ]: m6 P4 z4 L. t6 h
        }
7 d  `6 v; h7 e! _% K! y+ ?0 Z/ m3 G: L    }
+ M0 G" @4 X. S" ~& x5 E: b4 W( ]3 o& e- l0 @3 n0 j6 k
    return 0;
$ `8 R/ E3 L6 n$ X2 n! p! c7 _}# m0 q1 ^# t& Q
& J' ~! A# K& y6 n$ ]2 r0 q
--------------------- , I7 ^7 I. N- |/ Y1 D7 j
作者:nka_kun
0 Y8 y. e2 Y% o; }来源:CSDN ; D. \! }: r5 v4 L

; K2 \; ?9 j% O( z# @* g5 r& W- c9 w) J, `: X% Q
7 a; P' [, p; P9 I! R- ?2 r5 k





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5