| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:贴个 splay !!In Reply To:贴个 splay !! Posted by:wocha at 2013-10-18 22:30:08 > #include <iostream> > #include <algorithm> > #include <cstring> > #include <cstdio> > #define keyTree (ch[ ch[root][1] ][0]) > const int maxn = 1222222; > const int inf = 0x3f3f3f3f; > struct node { > int id,priority; > }; > struct SplayTree{ > int sz[maxn]; > int ch[maxn][2]; > int pre[maxn]; > int root , top1 , top2; > int ss[maxn] , que[maxn]; > inline void Rotate(int x,int f) { > int y = pre[x]; > ch[y][!f] = ch[x][f]; > pre[ ch[x][f] ] = y; > pre[x] = pre[y]; > if(pre[x]) ch[ pre[y] ][ ch[pre[y]][1] == y ] = x; > ch[x][f] = y; > pre[y] = x; > push_up(y); > } > inline void Splay(int x,int goal) { > while(pre[x] != goal) { > if(pre[pre[x]] == goal) { > Rotate(x , ch[pre[x]][0] == x); > } else { > int y = pre[x] , z = pre[y]; > int f = (ch[z][0] == y); > if(ch[y][f] == x) { > Rotate(x , !f) , Rotate(x , f); > } else { > Rotate(y , f) , Rotate(x , f); > } > } > } > push_up(x); > if(goal == 0) root = x; > } > inline void RotateTo(int k,int goal) { > int x = root; > while(sz[ ch[x][0] ] != k) { > if(k < sz[ ch[x][0] ]) { > x = ch[x][0]; > } else { > k -= (sz[ ch[x][0] ] + 1); > x = ch[x][1]; > } > } > Splay(x,goal); > } > inline void erase(int x) { > int father = pre[x]; > int head = 0 , tail = 0; > for (que[tail++] = x ; head < tail ; head ++) { > ss[top2 ++] = que[head]; > if(ch[ que[head] ][0]) que[tail++] = ch[ que[head] ][0]; > if(ch[ que[head] ][1]) que[tail++] = ch[ que[head] ][1]; > } > ch[ father ][ ch[father][1] == x ] = 0; > push_up(father); > } > int NewNode(node c) { > int x; > if (top2) x = ss[--top2]; > else x = ++top1; > ch[x][0] = ch[x][1] = pre[x] = 0; > sz[x] = 1; client[x] = c; > return x; > } > inline void push_up(int x) { > sz[x] = 1 + sz[ ch[x][0] ] + sz[ ch[x][1] ]; > } > > inline void init() { > ch[0][0] = ch[0][1] = pre[0] = sz[0] = 0; > root = top1 = 0; > node c; > c.priority = -inf; > c.id= 0; > int x = NewNode(c); > root=1; > c.priority = inf; > x = NewNode(c); > pre[x] = root; > ch[root][1]=x; > sz[root] = 2; > num = 0; > push_up(ch[root][1]); > push_up(root); > } > int Insert(int rt,node c) { > if(c.priority<client[rt].priority) { > if(ch[rt][0]) { > return Insert(ch[rt][0],c); > } else { > int x = NewNode(c); > pre[x]=rt; ch[rt][0]=x; > push_up(rt); > return x; > } > } > if(c.priority>client[rt].priority){ > if(ch[rt][1]) return Insert( ch[rt][1] ,c); > else { > int x = NewNode(c); > pre[x] = rt; ch[rt][1] = x; push_up(rt); > return x; > } > } > } > int readIn(){ > int op ; > node c; scanf("%d",&op); > if(op==0) return 0; > if(op==1) { > scanf("%d%d",&c.id,&c.priority); > int xx=Insert(root,c); Splay(xx,0); > num++; > } > if(op==2) { > if(num>=1) { > RotateTo(num-1,0); > RotateTo(num+1,root); > printf("%d\n",client[keyTree].id); > erase(keyTree); > num--; > } else puts("0"), root=1; > } > if(op==3) { > if(num>=1) { > RotateTo(0,0); RotateTo(2,root); > printf("%d\n",client[keyTree].id); > erase(keyTree); > num--; > } else puts("0"),root=1; > } > return 1; > } > node client[maxn]; > int num; > }spt; > int main() { > spt.init(); > while(spt.readIn()); > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator