Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 23593 | Accepted: 7066 |
Description
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.
Source
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int mm=1e5+9; int root[mm],kind[mm]; int n,m; void data() { for(int i=0;i<=n;i++) root[i]=i,kind[i]=0; } int look(int x) { int z; if(x^root[x]) { z=root[x]; root[x]=look(root[x]); kind[x]=(kind[x]+kind[z])%2; } return root[x]; } void uni(int ra,int rb,int a,int b) { root[ra]=rb;kind[ra]=(kind[a]-kind[b]+1)%2; } int main() { int cas; char s; scanf("%d",&cas); while(cas--) { scanf("%d%d",&n,&m); data();int a,b,ra,rb; for(int i=0;i<m;i++) { while((s=getchar())&&(s!='A'&&s!='D')); ///cin>>s>>a>>b; scanf("%d%d",&a,&b); ra=look(a);rb=look(b); if(s=='A') { if(ra^rb)printf("Not sure yet.\n"); else if(kind[a]==kind[b])printf("In the same gang.\n"); else printf("In different gangs.\n"); } else { if(ra^rb) uni(ra,rb,a,b); } } } }