• hdu 3487 Play with Chain (Splay)


    hdu 3487

    Splay树模板题

    题意:

      一开始给出1 2 3 4 ... n 这样一个序列,对这个序列进行以下两种操作:

        (1)CUT a b c: 将子串[a,b]切下来,放到剩余串的第c个数之后 。

        (2) FLIP a b : 将子串[a,b]翻转,如 1 2 3 4 就变成 4 3 2 1 。

    总之就是一道Splay树的模板题 。。。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <algorithm>
      4 #include <cmath>
      5 #include <cstring>
      6 #include <queue>
      7 #include <set>
      8 #include <vector>
      9 #include <map>
     10 #define ll long long
     11 
     12 using namespace std;
     13 
     14 const int N=100007;
     15 
     16 int cnt=1,root=0;
     17 int n,q;
     18 
     19 struct tree{
     20     int key,size,fa;
     21     bool flag;
     22     int son[2];
     23 }t[N*3];
     24 
     25 inline int newnode(int key,int fa){
     26     int x=cnt++;
     27     t[x].key=key;
     28     t[x].size=1;
     29     t[x].fa=fa;
     30     t[x].son[0]=t[x].son[1]=0;
     31     return x;
     32 }
     33 
     34 inline void pushup(int x){
     35     t[x].size=t[t[x].son[0]].size+t[t[x].son[1]].size+1;
     36 }
     37 
     38 inline void pushdown(int x){
     39     if (t[x].flag){
     40         t[x].flag=false;
     41         swap(t[x].son[0],t[x].son[1]);
     42         t[t[x].son[0]].flag^=1;
     43         t[t[x].son[1]].flag^=1;
     44     }
     45 }
     46 
     47 inline int bulid(int L,int R,int fa){
     48     if (L>R) return 0;
     49     int mid=(L+R)>>1;
     50     int x=newnode(mid,fa);
     51     t[x].son[0]=bulid(L,mid-1,x);
     52     t[x].son[1]=bulid(mid+1,R,x);
     53     pushup(x);
     54     return x;
     55 }
     56 
     57 inline void init(){
     58     root=0; cnt=1;
     59     root=bulid(0,n+1,0);
     60 }
     61 
     62 inline void rotate(int x,int p){
     63     int y=t[x].fa;
     64     pushdown(y); pushdown(x);
     65     t[y].son[!p]=t[x].son[p];
     66     t[t[x].son[p]].fa=y;
     67     t[x].fa=t[y].fa;
     68     if (t[y].fa)
     69         t[t[x].fa].son[t[t[x].fa].son[1]==y]=x;
     70     t[x].son[p]=y;
     71     t[y].fa=x;
     72     pushup(y);
     73     pushup(x);
     74 }
     75 
     76 inline void Splay(int x,int to){
     77     while (t[x].fa!=to){
     78         if (t[t[x].fa].fa==to)
     79             rotate(x,t[t[x].fa].son[0]==x);
     80         else {
     81             int y=t[x].fa, z=t[y].fa;
     82             int p=(t[z].son[0]==y);
     83             if (t[y].son[p]==x){
     84                 rotate(x,!p);
     85                 rotate(x,p);
     86             }
     87             else {
     88                 rotate(y,p);
     89                 rotate(x,p);
     90             }
     91         }
     92     }
     93     if (to==0) root=x;
     94 }
     95 
     96 inline int get_kth(int x,int k){
     97     if (x==0 || k>t[x].size) return 0;
     98     while (x){
     99         pushdown(x);
    100         if (k==t[t[x].son[0]].size+1) break;
    101         if (k>t[t[x].son[0]].size+1){
    102             k-=t[t[x].son[0]].size+1;
    103             x=t[x].son[1];
    104         }
    105         else 
    106             x=t[x].son[0];
    107     }
    108 
    109     return x;
    110 }
    111 
    112 inline void CUT(int L,int R,int c){
    113     Splay(get_kth(root,L),0);
    114     Splay(get_kth(root,R+2),root);
    115     int tmp=t[t[root].son[1]].son[0];
    116     t[t[root].son[1]].son[0]=0;
    117     pushup(t[root].son[1]);
    118     pushup(root);
    119 
    120     Splay(get_kth(root,c+1),0);
    121     Splay(get_kth(root,c+2),root);
    122     t[tmp].fa=t[root].son[1];
    123     t[t[root].son[1]].son[0]=tmp;
    124     pushup(t[root].son[1]);
    125     pushup(root);
    126 }
    127 
    128 inline void FILP(int L,int R){
    129     Splay(get_kth(root,L),0);
    130     Splay(get_kth(root,R+2),root);
    131     t[t[t[root].son[1]].son[0]].flag^=1;
    132     pushup(t[root].son[1]);
    133     pushup(root);
    134 }
    135 
    136 int cou=0;
    137 inline void output(int x){
    138     if (x==0) return;
    139     pushdown(x);
    140     output(t[x].son[0]);
    141     if (t[x].key>=1 && t[x].key<=n) {
    142         cou++;
    143         printf("%d",t[x].key);
    144         if (cou<n) printf(" ");
    145         else puts("");
    146     }
    147     output(t[x].son[1]);
    148 }
    149 
    150 char ch[20];
    151 
    152 int main(){
    153     int x,y,z;
    154     while (scanf("%d%d",&n,&q)!=EOF){
    155         if (n==-1) break;
    156         init();
    157         while (q--){
    158             scanf("%s",ch);
    159             if (ch[0]=='C'){
    160                 scanf("%d%d%d",&x,&y,&z);
    161                 CUT(x,y,z);
    162             }
    163             else {
    164                 scanf("%d%d",&x,&y);
    165                 FILP(x,y);
    166             }
    167         }
    168         cou=0;
    169         output(root);
    170     }
    171     return 0;
    172 }
  • 相关阅读:
    SDN第二次作业
    事后诸葛亮
    SDN第一次上机作业
    个人作业——软件产品案例分析
    SDN第一次作业
    Alpha冲刺总结报告
    Alpha冲刺Day10
    Alpha冲刺Day9
    Alpha冲刺Day8
    Alpha冲刺Day7
  • 原文地址:https://www.cnblogs.com/without-ACM/p/5931620.html
Copyright © 2020-2023  润新知