这道题暴力模拟会TLE,因为它是并查集的一个应用……
#include<bits/stdc++.h>
using namespace std;
int t,p,qq,f[30005],q[30005],s[30005],r1,r2,num;
//f数组记录父子关系,q为队列记录某一战舰到队头距离,s记录某一队头所在队列战舰数量和
char ch;
int find(int x)//并查集查找
{
if(f[x]==x)return x;
find(f[x]);
q[x]+=q[f[x]];
return f[x]=find(f[x]);//压缩路径
}
int main()
{
scanf("%d",&t);
for(int i=1; i<=30000; i++)
{
f[i]=i;
q[i]=0;
s[i]=1;
}//初始f数组以及2个队列
for(int i=1; i<=t; i++)
{
cin>>ch;
scanf("%d%d",&p,&qq);
r1=find(p),r2=find(qq);//并查集操作
if(ch=='M')
{
q[r1]+=s[r2];
f[r1]=r2;//r1父亲是r2
s[r2]+=s[r1];//移动后形成的舰队长度增加
s[r1]=0;//移动战舰队列后清空原队列
}
else if(ch=='C')
if(r1!=r2)printf("-1
");
else
{
num=abs(q[p]-q[qq])-1;//某一区间内战舰的数量就是其距离-1
printf("%d
",num);
}
}
return 0;
}