首页 > 代码库 > 【不可能的任务22/200】【填坑】bzoj3224 splay裸题

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

人生第一道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裸题