怎么说呢,这道题还是比较水的,连我这种蒟蒻都能写出来。但其中历尽艰辛,回想起来便老泪纵横。这道题思路很简单,建立一个父亲数组自然是不用多说的,除此之外建立一个数组表示一个数到队首的距离,另一个表示此数所在列的元素个数。我在第一次find函数写挂了,所以好好的学习了一下。后来我在本地运行十分顺畅,提交时却爆零,加上题目旁边有人在抱怨输入数据的格式,我就认为是某平台的问题,就此纠结了约半个小时。后来阅读代码时发现一行神奇的语句:for(int i=i;i<=n;i++),我还有什么可说呢?
虽说这道题不难,但也提醒我每一次打完代码都要自己逐字阅读。也算是很有收获吧!
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int father[30010];
int a[30010];
int b[30010];
int find(int x)
{
if(father[x]==x)return x;
int temp=find(father[x]);
a[x]=a[x]+a[father[x]];
return father[x]=temp;
}
int main()
{
int n,x,y,d,e;
char c;
cin>>n;
for(int i=1;i<=30000;i++)
{
father[i]=i;
b[i]=1;
}
for(int i=1;i<=n;i++)
{
cin>>c>>d>>e;
x=find(d);
y=find(e);
if(c=='M')
{
father[x]=y;
a[x]=b[y];
b[y]+=b[x];
}
else if(c=='C')
{
if(x!=y)
cout<<"-1"<<endl;
else
cout<<abs(a[d]-a[e])-1<<endl;
}
}
return 0;
}