poj1988Cute Stacking

题目大意:有几个stack,初始里面有一个cube。支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部。2.count x:数在x所在stack中,在x之下的cube的个数。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxn 300001

using namespace std;
int n,x,y;char c;
int cnt[maxn],sum[maxn],fa[maxn];

int find(int x)
{
    if(fa[x]==x) return fa[x];
    int f=fa[x];
    fa[x]=find(fa[x]);
    cnt[x]+=cnt[f];//cnt[i]表示i上面有几个。
    return fa[x];
}

void merge(int b,int a)
{
    fa[a]=b;//将a接到b上 
    cnt[a]=sum[b];//a的位置就是b里面的个数。
    sum[b]+=sum[a];//更新b的总数 
    sum[a]=0;//更新a的总数。 
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
        sum[i]=1;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        if(c=='M')
        {
            scanf("%d%d",&x,&y);
            int l1=find(x);
            int l2=find(y);
            merge(l1,l2);
        }
        else
        {
            scanf("%d",&x);
            int k=find(x);
            cout<<sum[k]-cnt[x]-1<<endl;//sum表示总数 
        }
    }
    return 0;
}
心若向阳,无谓悲伤

 

posted @ 2017-01-17 16:56  安月冷  阅读(134)  评论(0编辑  收藏  举报