zoukankan      html  css  js  c++  java
  • 【HDOJ】3487 Play with Chain

    Splay入门题目,区间翻转,区间分割。

      1 /*  */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <set>
      7 #include <stack>
      8 #include <vector>
      9 #include <deque>
     10 #include <algorithm>
     11 #include <cstdio>
     12 #include <cmath>
     13 #include <ctime>
     14 #include <cstring>
     15 #include <climits>
     16 #include <cctype>
     17 #include <cassert>
     18 #include <functional>
     19 #include <iterator>
     20 #include <iomanip>
     21 using namespace std;
     22 //#pragma comment(linker,"/STACK:102400000,1024000")
     23 
     24 #define sti                set<int>
     25 #define stpii            set<pair<int, int> >
     26 #define mpii            map<int,int>
     27 #define vi                vector<int>
     28 #define pii                pair<int,int>
     29 #define vpii            vector<pair<int,int> >
     30 #define rep(i, a, n)     for (int i=a;i<n;++i)
     31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     32 #define clr                clear
     33 #define pb                 push_back
     34 #define mp                 make_pair
     35 #define fir                first
     36 #define sec                second
     37 #define all(x)             (x).begin(),(x).end()
     38 #define SZ(x)             ((int)(x).size())
     39 #define lson            l, mid, rt<<1
     40 #define rson            mid+1, r, rt<<1|1
     41 #define grandlson        ch[ch[root][1]][0]
     42 
     43 const int maxn = 3e5+5;
     44 int pre[maxn], ch[maxn][2], root, tot;
     45 int key[maxn], s[maxn], rev[maxn];
     46 int stk[maxn], top;
     47 int n, m, cnt;
     48 
     49 void newNode(int& r, int fa, int k) {
     50     if (top)
     51         r = stk[top--];
     52     else
     53         r = ++tot;
     54     key[r] = k;
     55     pre[r] = fa;
     56     rev[r] = 0;
     57     ch[r][0] = ch[r][1] = 0;
     58     s[r] = 1;
     59 }
     60 
     61 void PushUp(int r) {
     62     s[r] = s[ch[r][0]] + s[ch[r][1]] + 1;
     63 }
     64 
     65 void UpdateRev(int rt) {
     66     if (rt == 0)    return ;
     67     swap(ch[rt][0], ch[rt][1]);
     68     rev[rt] ^= 1;
     69 }
     70 
     71 void PushDown(int rt) {
     72     if (rev[rt]) {
     73         UpdateRev(ch[rt][0]);
     74         UpdateRev(ch[rt][1]);
     75         rev[rt] = 0;
     76     }
     77 }
     78 
     79 void Build(int& rt, int l, int r, int fa) {
     80     if (l > r)    return ;
     81     
     82     int mid = (l + r) >> 1;
     83     
     84     newNode(rt, fa, mid);
     85     Build(ch[rt][0], l, mid-1, rt);
     86     Build(ch[rt][1], mid+1, r, rt);
     87     PushUp(rt);
     88 }
     89 
     90 void inorder(int rt) {
     91     if (rt == 0)    return ;
     92     inorder(ch[rt][0]);
     93     printf("s = %d, key = %d
    ", s[rt], key[rt]);
     94     inorder(ch[rt][1]);
     95 }
     96 
     97 void init() {
     98     root = tot = top = 0;
     99     ch[0][0] = ch[0][1] = s[0] = key[0] = pre[0] = rev[0] = 0;
    100     newNode(root, 0, -1);
    101     newNode(ch[root][1], root, -1);
    102     Build(grandlson, 1, n, ch[root][1]);
    103     PushUp(ch[root][1]);
    104     PushUp(root);
    105     #ifndef ONLINE_JUDGE
    106         inorder(root);
    107     #endif
    108 }
    109 
    110 void Rotate(int x, int d) {
    111     int y = pre[x];
    112     
    113     PushDown(y);
    114     PushDown(x);
    115     ch[y][d^1] = ch[x][d];
    116     pre[ch[x][d]] = y;
    117     if (pre[y])
    118         ch[pre[y]][ch[pre[y]][1]==y] = x;
    119     pre[x] = pre[y];
    120     pre[y] = x;
    121     ch[x][d] = y;
    122     PushUp(y);
    123 }
    124 
    125 void Splay(int r, int goal) {
    126     PushDown(r);
    127     while (pre[r] != goal) {
    128         if (pre[pre[r]] == goal) {
    129             PushDown(pre[r]);
    130             PushDown(r);
    131             Rotate(r, ch[pre[r]][0]==r);
    132         } else {
    133             PushDown(pre[pre[r]]);
    134             PushDown(pre[r]);
    135             PushDown(r);
    136             int y = pre[r];
    137             int d = ch[pre[y]][0]==y;
    138             if (ch[y][d] == r) {
    139                 Rotate(r, d^1);
    140                 Rotate(r, d);
    141             } else {
    142                 Rotate(y, d);
    143                 Rotate(r, d);
    144             }
    145         }
    146     }
    147     PushUp(r);
    148     if (goal == 0)
    149         root = r;
    150 }
    151 
    152 int kth(int r, int k) {
    153     PushDown(r);
    154     int t = s[ch[r][0]] + 1;
    155     
    156     if (t == k)
    157         return r;
    158     else if (k < t)
    159         return kth(ch[r][0], k);
    160     else
    161         return kth(ch[r][1], k-t);
    162 }
    163 
    164 void cut(int l, int r, int c) {
    165     Splay(kth(root, l), 0);
    166     Splay(kth(root, r+2), root);
    167     int tmp = grandlson;
    168     grandlson = 0;
    169     PushUp(ch[root][1]);
    170     PushUp(root);
    171     Splay(kth(root, c+1), 0);
    172     Splay(kth(root, c+2), root);
    173     grandlson = tmp;
    174     pre[tmp] = ch[root][1];
    175     PushUp(ch[root][1]);
    176     PushUp(root);
    177 }
    178 
    179 void flip(int l, int r) {
    180     Splay(kth(root, l), 0);
    181     Splay(kth(root, r+2), root);
    182     UpdateRev(grandlson);
    183     PushUp(ch[root][1]);
    184     PushUp(root);
    185 }
    186 
    187 void print(int rt) {
    188     if (!rt)    return ;
    189     
    190     PushDown(rt);
    191     print(ch[rt][0]);
    192     if (cnt>=1 && cnt<=n) {
    193         if (cnt < n)
    194             printf("%d ", key[rt]);
    195         else
    196             printf("%d
    ", key[rt]);
    197     }
    198     ++cnt;
    199     print(ch[rt][1]);
    200 }
    201 
    202 int main() {
    203     ios::sync_with_stdio(false);
    204     #ifndef ONLINE_JUDGE
    205         freopen("data.in", "r", stdin);
    206         freopen("data.out", "w", stdout);
    207     #endif
    208     
    209     char cmd[7];
    210     int a, b, c;
    211     
    212     while (scanf("%d %d", &n, &m) != EOF) {
    213         if (n<0 && m<0)
    214             break;
    215         init();
    216         while (m--) {
    217             scanf("%s %d %d", cmd, &a, &b);
    218             if (cmd[0] == 'C') {
    219                 scanf("%d", &c);
    220                 cut(a, b, c);
    221             } else {
    222                 flip(a, b);
    223             }
    224         }
    225         cnt = 0;
    226         print(root);
    227     }
    228     
    229     #ifndef ONLINE_JUDGE
    230         printf("time = %d.
    ", (int)clock());
    231     #endif
    232     
    233     return 0;
    234 }
  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4903217.html
Copyright © 2011-2022 走看看