一开始拿到这题不知道该怎么去做,想用opposite[i]来保存相对立的数,最后做出来连样例都跑不起来,查说有两种做法:
一:分组,把1~n看成一组,把n+1~2n看成相对立的另一组;
二:用并查集的便宜向量来做;
先给出用分组来做的;
#include<cstdio>
const int maxn=1e5+5;
int p[maxn<<1];
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=2*n;i++)p[i]=i;
int a,b;
char s[2];
while(m--){
scanf("%s%d%d",s,&a,&b);
int x1=find(a),y1=find(a+n);
int x2=find(b),y2=find(b+n);
if(s[0]=='A'){
if(x1!=x2&&y1!=x2)printf("Not sure yet.\n");//y1==x2表示相对
else if(x1==x2)printf("In the same gang.\n");
else printf("In different gangs.\n");
}
else if(s[0]=='D'){
p[y1]=x2;
p[y2]=x1;
}
}
}
return 0;
}