Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:
1. D [a] [b]
where [a] and [b] are the numbers of two criminals, and they belong to different gangs.
2. A [a] [b]
where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.
Input
Output
Sample Input
1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
Sample Output
Not sure yet.
In different gangs.
In the same gang.
今天下午教主突然来了一场手速题,本猪真是有苦说不出啊。清明三天的集训结束了,收获了不少,无论从选题,团队的配合还是算法上都学到了很多,(T~T其实本猪想说提升最大最多的还是心理承受能力),明天又正式上课了,突然感觉好幸福... ...
这是不久前集训的时候一场比赛的题,当时16级能A出来的寥寥无几,当时我还在用数组做呢,现在回看这个题,觉得毫无压力。感叹我们真的进步了许多,这种进步在平时是看不出来的,只有与之前对比才会显现出来,所以,本猪相信,努力必然会进步!(=。=!来,喝了这碗掺杂着DDV的毒鸡汤养养胃)
题目大意:有两个帮派,给你一些信息关于两个人是不是在不同帮派里,然后让你判断出任意两人是不是同一帮派的。创建一个2*N的并查集即可。一开始无法输入数字,发现没用getchar吃回车。RE了一次,数组开小了,应该是两倍。
附上AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int par[maxn*2];
int T;
int n,m;
int x,y;
char c;
void init(int a)
{
for(int i=0;i<=2*a;i++)
par[i]=i;
}
int find(int a)
{
if(a==par[a])
return a;
return par[a]=find(par[a]);
}
void unite(int a,int b)
{
a=find(a);
b=find(b);
if(a==b) return;
par[a]=b;
}
bool same(int a,int b)
{
return find(a)==find(b);
}
int main()
{
scanf("%d",&T);
getchar();
while(T--)
{
scanf("%d%d",&n,&m);
getchar();
init(n);
for(int i=0;i<m;i++)
{
scanf("%c%d%d",&c,&x,&y);
getchar();
if(c=='A')
{
if(same(x,y+n))
printf("In different gangs.\n");
else if(same(x,y))
printf("In the same gang.\n");
else
printf("Not sure yet.\n");
}
else if(c=='D')
{
unite(x,y+n);
unite(x+n,y);
}
}
}
return 0;
}