码迷,mamicode.com
首页 > 其他好文 > 详细

【不可能的任务22/200】【填坑】bzoj3224 splay裸题

时间:2016-09-25 21:57:46      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题

 1 #include <cstdio>
 2 int root,N=0,n,p,q;
 3 int fa[100001],c[100001][2],size[100001],sp[100001];
 4 void rot(int x)
 5 {
 6     int y=fa[x],k=(c[y][0]==x);
 7     size[y]=size[c[y][k]]+size[c[x][k]]+1;size[x]=size[c[x][!k]]+size[y]+1;
 8     c[y][!k]=c[x][k];fa[c[y][!k]]=y;
 9     fa[x]=fa[y];if(fa[y])c[fa[y]][c[fa[y]][1]==y]=x;
10     c[x][k]=y;fa[y]=x;
11 }
12 void rots(int x,int g)
13 {
14     for(int y=fa[x];y!=g;rot(x),y=fa[x])
15     if(fa[y]!=g)    rot((x==c[y][0])==(y==c[fa[y]][0])?y:x);
16     if(g==0) root=x;
17 }
18 void insert(int x)
19 {
20     int y=root;
21     while(c[y][x>sp[y]]) y=c[y][x>sp[y]];
22     sp[++N]=x;c[N][0]=c[N][1]=0;fa[N]=y;if(y)c[y][x>sp[y]]=N;
23     rots(N,0);
24 }
25 void del(int x)
26 {
27     int y=root;
28     while(sp[y]!=x) y=c[y][x>sp[y]];
29     rots(y,0);y=c[root][1];
30     bool b;
31     if(!y) b=1,y=c[root][0];else b=0;
32     while(c[y][b]) y=c[y][b];
33     rots(y,root);
34     c[y][b]=c[root][b];fa[c[root][b]]=y;fa[y]=0;root=y;
35     size[y]=size[c[y][!b]]+size[c[y][b]];
36 }
37 int rank(int x)
38 {
39     int y=root,ans=0;
40     if(x==918145){
41         printf("");
42     }
43     while(y)
44         if(x>sp[y])
45             ans+=size[c[y][0]]+1,y=c[y][1];
46         else y=c[y][0];
47     return ans+1;
48 }
49 int num(int x)
50 {
51     int y=root;
52     while(x)
53     if(size[c[y][0]]+1<x)
54         x-=size[c[y][0]]+1,y=c[y][1];
55     else if(size[c[y][0]]+1==x) return sp[y];
56     else y=c[y][0];
57     return sp[y];
58 }
59 int pre(int x)
60 {
61     int ans;
62     for(int y=root;y;)
63     if(sp[y]<x)
64         ans=sp[y],y=c[y][1];
65     else y=c[y][0];
66     return ans;
67 }
68 int nex(int x)
69 {
70     int ans;
71     for(int y=root;y;)
72     if(sp[y]<=x)
73         y=c[y][1];
74     else ans=sp[y],y=c[y][0];
75     return ans;
76 }
77 int main()
78 {
79     freopen("1.out","w",stdout);
80     scanf("%d",&n);
81     for(int i=1;i<=n;i++)
82     {
83         scanf("%d%d",&p,&q);
84         if(p==1) insert(q);
85         if(p==2) del(q);
86         if(p==3) printf("%d\n",rank(q));
87         if(p==4) printf("%d\n",num(q));
88         if(p==5) printf("%d\n",pre(q));
89         if(p==6) printf("%d\n",nex(q));
90     }
91     return 0;
92 }

貌似所有该犯的问题都犯了一遍了,,,感觉自己逻辑不够严谨啊

难道要背板???那么长感觉下不来啊

【不可能的任务22/200】【填坑】bzoj3224 splay裸题

标签:

原文地址:http://www.cnblogs.com/wanglichao/p/5906765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!