# hdu 1890 Robotic Sort

很早就会了splay。。。但是这题一直没有AC....

  1 #include<cstdio>
2 #include<cstring>
3 #include<cmath>
4 #include<ctime>
5 #include<cstdlib>
6 #include<cassert>
7 #include<algorithm>
8 #include<iostream>
9 #include<string>
10 #include<deque>
11 #include<vector>
12 #include<queue>
13 #include<list>
14 #include<stack>
15 #include<set>
16 #include<map>
17 #include<bitset>
19 using namespace std;
20 typedef long long ll;
21 typedef pair<int,int> pii;
22 const int N=(int)1e5+10;
23 int hash[N];
24 int nn;
25 struct splaytree{
26     int cnt,root;
27     int sz[N],ch[N][2],pre[N];
28     int rev[N];
29     void newnode(int &t,int val){
30         t=hash[val];
31         sz[t]=1;
32         ch[t][0]=ch[t][1]=pre[t]=0;
33         rev[t]=0;
34     }
35     void pushup(int x){
36         sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
37     }
38     void pushdown(int x){
39         if(rev[x]){
40             if(ch[x][0])rev[ch[x][0]]^=1;
41             if(ch[x][1])rev[ch[x][1]]^=1;
42             swap(ch[x][0],ch[x][1]);
43             rev[x]=0;
44         }
45     }
46     bool dir(int x){
47         return ch[pre[x]][1]==x;
48     }
49     void link(int x,int y,int d){
50         if(y)ch[y][d]=x;
51         if(x)pre[x]=y;
52     }
53     void rotate(int x){
54         int y=pre[x];bool d=dir(x);
55         pushdown(y);pushdown(x);
59         pushup(y);
60     }
61     void dfs(int x){
62         if(x==0)return;
63         dfs(pre[x]);
64         pushdown(x);
65     }
66     void splay(int x,int goal){
67         dfs(x);
68         while(pre[x]!=goal){
69             if(pre[pre[x]]==goal)rotate(x);
70             else{
71                 if(dir(x)==dir(pre[x]))rotate(pre[x]);
72                 else rotate(x);
73                 rotate(x);
74             }
75         }
76         pushup(x);
77         if(0==goal)root=x;
78     }
79     void select(int k,int goal){
80         int x=root;pushdown(x);
81         while(sz[ch[x][0]]+1!=k){
82             if(sz[ch[x][0]]+1>k){
83                 x=ch[x][0];
84             }else{
85                 k-=sz[ch[x][0]]+1;
86                 x=ch[x][1];
87             }
88             pushdown(x);
89         }
90         splay(x,goal);
91     }
92     void init(){
93         cnt=root=0;
94         sz[0]=ch[0][0]=ch[0][1]=pre[0]=0;
95     }
96     void insert(int val){
97         int x=root;
98         while(ch[x][1])x=ch[x][1];
99         newnode(ch[x][1],val);
100         pre[ch[x][1]]=x;
101         splay(ch[x][1],root);
102     }
103     void debug(int x){
104 //        printf("x = %d left = %d right = %d pre = %d\n",x,ch[x][0],ch[x][1],pre[x]);
105         printf("%d ",x);
106     }
107     void all(int n){
108         for(int i=1;i<=n;i++)debug(i);
109     }
110     void show(int x){
111         if(x==0)return;
112         pushdown(x);
113         show(ch[x][0]);
114         debug(x);
115         show(ch[x][1]);
116     }
117     int solve(int x){
118         splay(x,0);
119         int rank=sz[ch[x][0]]+1;
120         if(ch[x][0])rev[ch[x][0]]^=1;
121         if(sz[ch[x][0]]==0&&sz[ch[x][1]]!=0){
122             root=ch[x][1];
123             pre[ch[x][1]]=0;
124         }else if(sz[ch[x][0]]!=0&&sz[ch[x][1]]==0){
125             select(rank-1,0);
126             ch[root][1]=0;
127             pushup(root);
128         }else if(sz[ch[x][0]]!=0&&sz[ch[x][1]]!=0){
129             select(rank-1,0);
130             select(rank+1,root);
131             ch[ch[root][1]][0]=0;
132             pushup(ch[root][1]);
133             pushup(root);
134         }else{
135             root=0;
136         }
137         return rank;
138     }
139
140 }spt;
141 struct node{
142     int val,id;
143     bool operator<(const node &a)const{
144         return val < a.val||(val==a.val&&id < a.id);
145     }
146 }s[N];
147 int main(){
148     int n;
149     while(~scanf("%d",&n)){
150         nn=n;
151         if(n==0)return 0;
152         for(int i=1;i<=n;i++){
153             scanf("%d",&s[i].val);
154             s[i].id=i;
155         }
156         sort(s+1,s+1+n);
157         for(int i=1;i<=n;i++)
158             hash[s[i].id]=i;
159         spt.init();
160         for(int i=1;i<=n;i++){
161             spt.insert(i);
162         }
163         int cur=0;
164         for(int i=1;i<=n;i++){
165             int now = spt.solve(i);
166             if(i!=1)printf(" ");
167             printf("%d",cur+now);
168             cur++;
169         }
170         puts("");
171     }
172     return 0;
173 }

posted @ 2013-09-24 10:49  silver__bullet  阅读(312)  评论(0编辑  收藏  举报