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; }
折花枝,恨花枝,准拟花开人共卮,开时人去时。
怕相思,已相思,轮到相思没处辞,眉间露一丝。