【题意】
有几个stack,初始里面有一个cube。支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部。2.count x:数在x所在stack中,在x之下的cube的个数。
【题解】
并查集。与银河英雄传说类似。
维护两个量s[x]和d[x],表示子树大小和到根的距离。
详情看代码:
#include <iostream>
using namespace std;
const int maxn=30007;
int fa[maxn],d[maxn],s[maxn];
int p;
int find(int x)
{
if (fa[x]==x) return x;
int t=fa[x];
fa[x]=find(fa[x]);
d[x]+=d[t];
return fa[x];
}
void unite(int x,int y)
{
x=find(x);y=find(y);
fa[x]=y;
d[x]+=s[y];
s[y]+=s[x];
s[x]=0;
}
int main()
{
freopen("pin.txt","r",stdin);
freopen("pou.txt","w",stdout);
int i,x,y;
char ch;
for (i=1;i<=maxn;i++)
{
s[i]=1;d[i]=0;
fa[i]=i;
}
scanf("%d\n",&p);
for (i=1;i<=p;i++)
{
scanf("%c",&ch);
getchar();
if (ch=='M')
{
scanf("%d%d\n",&x,&y);
unite(x,y);
}
else
{
scanf("%d\n",&x);
find(x);
printf("%d\n",d[x]);
}
}
return 0;
}