HDU1890-Robotic Sort-Splay

  1 #include <cstdio>
  2 #include <algorithm>
  3 #include <cstring>
  4 
  5 using namespace std;
  6 
  7 #define Key_value (ch[ch[root][1] ][0])
  8 
  9 const int maxn = 2e5+10;
 10 const int INF = 0x3f3f3f3f;
 11 
 12 int pre[maxn],ch[maxn][2],key[maxn],size[maxn];
 13 int root,tot1;
 14 int rev[maxn];
 15 int s[maxn],tot2;
 16 int N;
 17 
 18 struct Node{
 19     int num,id;
 20     bool operator < (const Node &rhs) const
 21     {
 22         if(num == rhs.num) return id < rhs.id;
 23         else return num < rhs.num;
 24     }
 25 }node[maxn];
 26 
 27 void Treavel(int x)
 28 {
 29     if(x)
 30     {
 31         Treavel(ch[x][0]);
 32         printf("结点:%2d: 左儿子 %2d 右儿子 %2d 父结点 %2d size= %2d val=%2d
",x,ch[x][0],ch[x][1],pre[x],size[x],key[x]);
 33         Treavel(ch[x][1]);
 34     }
 35 }
 36 
 37 void debug()
 38 {
 39     printf("root:%d
",root);
 40     Treavel(root);
 41 }
 42 
 43 void NewNode(int &o,int father,int k)
 44 {
 45     o = k;
 46     pre[o] = father;
 47     ch[o][0] = ch[o][1] = 0;
 48     rev[o] = 0;
 49     size[o] = 1;
 50 }
 51 void update_rev(int o)
 52 {
 53     if(!o) return ;
 54     swap(ch[o][0],ch[o][1]);
 55     rev[o] ^= 1;
 56 }
 57 void push_up(int o)
 58 {
 59     int lson = ch[o][0],rson = ch[o][1];
 60     size[o] = size[lson]+size[rson] + 1;
 61 }
 62 void push_down(int o)
 63 {
 64     if(rev[o])
 65     {
 66         update_rev(ch[o][0]);
 67         update_rev(ch[o][1]);
 68         rev[o] = 0;
 69     }
 70 }
 71 void Build(int &x,int l,int r,int father)
 72 {
 73     if(l > r) return ;
 74     int mid = (l+r)>>1;
 75     NewNode(x,father,mid);
 76     Build(ch[x][0],l,mid-1,x);
 77     Build(ch[x][1],mid+1,r,x);
 78     push_up(x);
 79 }
 80 void Init()
 81 {
 82     root = tot1 = tot2 = 0;
 83     ch[root][0] = ch[root][1] = size[root] = pre[root] = 0;
 84     rev[root] = 0;
 85     NewNode(root,0,N+1);
 86     NewNode(ch[root][1],root,N+2);
 87 
 88     Build(Key_value,1,N,ch[root][1]);
 89     push_up(ch[root][1]);
 90     push_up(root);
 91 }
 92 void Rotate(int x,int kind)
 93 {
 94     int y = pre[x];
 95     push_down(y);
 96     push_down(x);
 97     ch[y][!kind] = ch[x][kind];
 98     pre[ch[x][kind] ] = y;
 99     if(pre[y])
100         ch[pre[y] ][ch[pre[y]][1]==y ] = x;
101     pre[x] = pre[y];
102     ch[x][kind] = y;
103     pre[y] = x;
104     push_up(y);
105 }
106 void Splay(int x,int goal)
107 {
108     push_down(x);
109     while(pre[x] != goal)
110     {
111         if(pre[pre[x] ] == goal)
112         {
113             push_down(pre[x]);
114             push_down(x);
115             Rotate(x,ch[pre[x]][0]==x);
116         }
117         else
118         {
119             push_down(pre[pre[x] ]);
120             push_down(pre[x]);
121             push_down(x);
122             int y = pre[x];
123             int kind = ch[pre[y] ][0] == y;
124             if(ch[y][kind] == x)
125             {
126                 Rotate(x,!kind);
127                 Rotate(x,kind);
128             }
129             else
130             {
131                 Rotate(y,kind);
132                 Rotate(x,kind);
133             }
134         }
135     }
136     push_up(x);
137     if(goal == 0) root = x;
138 }
139 int Get_kth(int x,int k)
140 {
141     push_down(x);
142     int t = size[ch[x][0]] + 1;
143     if(t==k) return x;
144     if(t > k) return Get_kth(ch[x][0],k);
145     else return Get_kth(ch[x][1],k-t);
146 }
147 int Get_next(int x)
148 {
149     push_down(x);
150     if(ch[x][1] == 0) return -1;
151     x = ch[x][1];
152     while(ch[x][0])
153     {
154         x = ch[x][0];
155         push_down(x);
156     }
157     return x;
158 }
159 int main()
160 {
161     while(scanf("%d",&N) && N)
162     {
163         for(int i=1;i<=N;i++)
164         {
165             scanf("%d",&node[i].num);
166             node[i].id = i;
167         }
168         sort(node+1,node+N+1);
169         Init();
170         for(int i=1;i<=N;i++)
171         {
172             Splay(node[i].id,0);
173             printf("%d%s",size[ch[root][0]],i==N?"":" ");
174             Splay(Get_kth(root,i),0);
175             Splay(Get_next(node[i].id),root);
176             update_rev(Key_value);
177         }
178         printf("
");
179     }
180 }
原文地址:https://www.cnblogs.com/helica/p/5493754.html