• UVA11922--Permutation Transformer (伸展树Splay)


    题意:m条操作指令,对于指令 a  b 表示取出第a~b个元素,翻转后添加到排列的尾部。

    水题卡了一个小时,一直过不了样例。  原来是 dfs输出的时候 忘记向下传递标记了。

      1 #include <cstdio>
      2 #include <cstdlib>
      3 #include <cstring>
      4 #include <algorithm>
      5 using namespace std;
      6 const double eps = 1e-8;
      7 const int maxn = 100086;
      8 int siz[maxn],pre[maxn],ch[maxn][2],rev[maxn],key[maxn];
      9 int n,m,tot,root;
     10 void update_rev(int r)
     11 {
     12     if (!r)
     13         return;
     14     swap(ch[r][0],ch[r][1]);
     15     rev[r] ^= 1;
     16 }
     17 void push_up(int r)
     18 {
     19     siz[r] = siz[ch[r][0]] + siz[ch[r][1]] + 1;
     20 }
     21 void push_down(int r)
     22 {
     23     if (rev[r])
     24     {
     25         update_rev(ch[r][0]);
     26         update_rev(ch[r][1]);
     27         rev[r] = 0;
     28     }
     29 }
     30 void NewNode(int &r,int father,int k)
     31 {
     32     r = ++tot;
     33     pre[r] = father;
     34     ch[r][0] = ch[r][1] = 0;
     35     key[r] = k;
     36     rev[r] = 0;
     37     siz[r] = 1;
     38 }
     39 void build(int &x,int l,int r,int father)
     40 {
     41     if (l > r)
     42         return;
     43     int mid = (l + r) >> 1;
     44     NewNode(x,father,mid);
     45     build(ch[x][0],l,mid-1,x);
     46     build(ch[x][1],mid+1,r,x);
     47     push_up(x);
     48 }
     49 void init()
     50 {
     51     root = tot = 0;
     52     NewNode(root,0,-1);
     53     NewNode(ch[root][1],root,-1);
     54     build(ch[ch[root][1]][0],1,n,ch[root][1]);
     55     push_up(root);
     56     push_up(ch[root][1]);
     57 }
     58 void Rotate(int x,int kind)
     59 {
     60     int y = pre[x];
     61     push_down(y);
     62     push_down(x);
     63     ch[y][!kind] = ch[x][kind];
     64     pre[ch[x][kind]] = y;
     65     if (pre[y])
     66         ch[pre[y]][ch[pre[y]][1] == y] = x;
     67     pre[x] = pre[y];
     68     ch[x][kind] = y;
     69     pre[y] = x;
     70     push_up(y);
     71 }
     72 void Splay(int r,int goal)
     73 {
     74     push_down(r);
     75     while (pre[r] != goal)
     76     {
     77         if (pre[pre[r]] == goal)
     78         {
     79             push_down(pre[r]);
     80             push_down(r);
     81             Rotate(r,ch[pre[r]][0] == r);
     82         }
     83         else
     84         {
     85             int y = pre[r];
     86             int kind = (ch[pre[y]][1] == y);
     87             push_down(pre[y]);
     88             push_down(y);
     89             push_down(r);
     90             if (ch[y][kind] == r)
     91             {
     92                 Rotate(y,!kind);
     93                 Rotate(r,!kind);
     94             }
     95             else
     96             {
     97                 Rotate(r,kind);
     98                 Rotate(r,!kind);
     99             }
    100         }
    101     }
    102     push_up(r);
    103     if (goal == 0)
    104         root = r;
    105 }
    106 int Get_kth(int r,int k)
    107 {
    108     push_down(r);
    109     int t = siz[ch[r][0]] + 1;
    110     if (k == t)
    111         return r;
    112     if (k >= t)
    113         return Get_kth(ch[r][1],k-t);
    114     else
    115         return Get_kth(ch[r][0],k);
    116 }
    117 void Reverse(int u,int v)
    118 {
    119     Splay(Get_kth(root,u),0);
    120     Splay(Get_kth(root,v+2),root);
    121     update_rev(ch[ch[root][1]][0]);
    122     push_up(ch[root][1]);
    123     push_up(root);
    124 }
    125 void dfs(int r)
    126 {
    127     if (!r)
    128         return;
    129     push_down(r);
    130     dfs(ch[r][0]);
    131     if (r != -1 && key[r] != -1)        //-1设置的虚节点 
    132         printf("%d
    ",key[r]);
    133     dfs(ch[r][1]);
    134 }
    135 int main(void)
    136 {
    137     #ifndef ONLINE_JUDGE
    138         freopen("in.txt","r",stdin);
    139     #endif
    140     while (~scanf ("%d%d",&n,&m))
    141     {
    142         init();
    143         for (int i = 0; i < m; i++)
    144         {
    145             int u,v;
    146             scanf ("%d%d",&u,&v);
    147             Reverse(u,n);
    148             Reverse(u,u+n-v-1);
    149         }
    150         dfs(root);
    151     }
    152     return 0;
    153 }
  • 相关阅读:
    POJ
    UPC-5843: 摘樱桃(最优状态递推)
    BZOJ-1088 [SCOI2005]扫雷Mine(递推+思维)
    HDU-3065 病毒侵袭持续中(AC自动机)
    BZOJ-4236 JOIOJI (map查找+思维)
    HDU-2896 病毒侵袭(AC自动机)
    Hrbust-2060 截取方案数(KMP)
    UVALive 4490 压缩DP
    UVALive 5881
    UVALive 4168
  • 原文地址:https://www.cnblogs.com/oneshot/p/4081566.html
Copyright © 2020-2023  润新知