存个代码,233

Posted 微弱的世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存个代码,233相关的知识,希望对你有一定的参考价值。

技术分享
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define MAXN 50010
  4 struct node
  5 {
  6     int left,right;
  7 }tree[MAXN];
  8 int father[MAXN],rev[MAXN],Stack[MAXN],cc[MAXN];
  9 int read()
 10 {
 11     int s=0,fh=1;char ch=getchar();
 12     while(ch<0||ch>9){if(ch==-)fh=-1;ch=getchar();}
 13     while(ch>=0&&ch<=9){s=s*10+(ch-0);ch=getchar();}
 14     return s*fh;
 15 }
 16 int isroot(int x)
 17 {
 18     return tree[father[x]].left!=x&&tree[father[x]].right!=x;
 19 }
 20 void pushdown(int x)
 21 {
 22     int l=tree[x].left,r=tree[x].right;
 23     if(rev[x]!=0)
 24     {
 25         rev[x]^=1;rev[l]^=1;rev[r]^=1;
 26         swap(tree[x].left,tree[x].right);
 27     }
 28 }
 29 void rotate(int x)
 30 {
 31     int y=father[x],z=father[y];
 32     if(!isroot(y))
 33     {
 34         if(tree[z].left==y)tree[z].left=x;
 35         else tree[z].right=x;
 36     }
 37     if(tree[y].left==x)
 38     {
 39         father[x]=z;father[y]=x;tree[y].left=tree[x].right;tree[x].right=y;father[tree[y].left]=y;
 40     }
 41     else
 42     {
 43         father[x]=z;father[y]=x;tree[y].right=tree[x].left;tree[x].left=y;father[tree[y].right]=y;
 44     }
 45 }
 46 void splay(int x)
 47 {
 48     int top=0,y,z,i;Stack[++top]=x;
 49     for(i=x;!isroot(i);i=father[i])Stack[++top]=father[i];
 50     for(i=top;i>=1;i--)pushdown(Stack[i]);
 51     while(!isroot(x))
 52     {
 53         y=father[x];z=father[y];
 54         if(!isroot(y))
 55         {
 56             if((tree[y].left==x)^(tree[z].left==y))rotate(x);
 57             else rotate(y);
 58         }
 59         rotate(x);
 60     }
 61 }
 62 void access(int x)
 63 {
 64     int last=0;
 65     while(x!=0)
 66     {
 67         splay(x);
 68         tree[x].right=last;
 69         last=x;x=father[x];
 70     }
 71 }
 72 void makeroot(int x)
 73 {
 74     access(x);splay(x);rev[x]^=1;
 75 }
 76 void link(int u,int v)
 77 {
 78     makeroot(u);/*access(u);*/father[u]=v;//splay(u);
 79 }
 80 void cut(int u,int v)
 81 {
 82     /*makeroot(u);*/access(u);access(v);splay(v);father[tree[v].left]=0;tree[v].left=0;
 83 }
 84 int findroot(int x)
 85 {
 86     access(x);splay(x);
 87     while(tree[x].left!=0)x=tree[x].left;
 88     return x;
 89 }
 90 int Findroot(int u,int v)
 91 {
 92     int pd=0;
 93     access(u);splay(u);
 94     while(tree[u].left!=0){if(tree[u].left==v){pd=1;break;}u=tree[u].left;}
 95     return pd;
 96 }
 97 int main()
 98 {
 99     int n,i,m,k,x,y,a,tt=0;
100     char fh[30];
101     while(scanf("%d",&n)!=EOF)
102     {
103         if(tt)puts("");
104         tt++;
105         for(i=1;i<=n;i++)
106         {
107             tree[i].left=tree[i].right=father[i]=rev[i]=cc[i]=0;
108         }
109         for(i=1;i<=n;i++)
110         {
111             a=read();
112             if(a!=0)
113             {
114                 link(i,a);
115                 cc[i]=a;
116             }
117         }
118         m=read();
119         for(i=1;i<=m;i++)
120         {
121             scanf("\n%s",fh);
122             if(fh[0]==Q)
123             {
124                 k=read();
125                 printf("%d\n",findroot(k));
126             }
127             else
128             {
129                 x=read();y=read();
130                 if(x!=0&&y!=0)
131                 {
132                     if(Findroot(y,x)==1)continue;
133                 }
134                 if(cc[x]!=0)
135                 {
136                     cut(x,cc[x]);
137                     //access(x);access(cc[x]);splay(cc[x]);father[tree[cc[x]].left]=0;tree[cc[x]].left=0;/*splay(cc[x]);*///father[x]=tree[cc[x]].left=0;
138                 }
139                 cc[x]=y;
140                 if(cc[x]!=0)
141                 {
142                     //link(x,cc[x]);
143                     access(x);father[x]=cc[x];//splay(x);
144                 }
145             }
146         }
147         //printf("\n");
148     }
149     return 0;
150 }
View Code

 

以上是关于存个代码,233的主要内容,如果未能解决你的问题,请参考以下文章

poj1743 后缀数组, poj挂了 存个代码

hihocoder第233周

C++ int i[233];我直接这样写代表了啥意思?

P2470,我就来存个档

力扣竞赛233场题解

java枚举类 (近期读书笔记整理,复习所用,存个档