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 }
  • 相关阅读:
    [EasyUI美化换肤]更换EasyUi图标
    [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
    SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
    对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
    EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
    采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
    android ViewFlipper(翻转视图) 使用
    Android 下拉列表Spinner 使用
    Android选项卡TabHost功能和用法
    【android,eclipse解决】eclipse insert "}" to complete ClassBodyR.java
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4903217.html
Copyright © 2011-2022 走看看