10317 Fans of Footbal Teams
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
Two famous football teams, named AC Milan(AC米兰) and Inter Milan(国际米兰) will have a match in GuangZhou City, which is exciting. So a lot of fans get together to watch the wonderful match. This trouble the local polices. In order to avoid a chaos caused by fans of the two teams, the police office in GuangZhou City decides to arrange the seats of the gymnasium(体育馆) during the match. All fans of AC Milan seat Noth, while all fans of Inter Milan seat South . However, the police first needs to identify which team a fan support. The present question is, given two fans; do they support a same team? You must give your judgment based on incomplete information. Assume N (N <= 10^5) fans are currently in GuangZhou City, numbered from 1 to N. 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 fans, and they support different teams. 2. A [a] [b] where [a] and [b] are the numbers of two fans. This requires you to decide whether a and b support a same team.
输入格式
The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. Each test case begins with a line with two integers N and M, followed by M lines each containing one message as described above.
输出格式
For each message "A [a] [b]" in each case, your program should give the judgment based on the information got before. The answers might be one of "Support the same team.", "Support different teams." and "Not sure yet."
输入样例
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
输出样例
Not sure yet. Support different teams. Support the same team.
这道题我一开始没想到怎么用并查集做,后来才知道之前思维被局限了,其实可以把pre数组扩充一倍,让i+n表示i非,这样每次连通l和r+n,r和l+n,就能满足题意了。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <stack> #include <bitset> #include <queue> #include <set> #include <map> #include <string> #include <algorithm> #define Si(a) scanf("%d",&a) #define Sl(a) scanf("%lld",&a) #define Sd(a) scanf("%lf",&a) #define Ss(a) scanf("%s",a) #define Pi(a) printf("%d\n",(a)) #define Pl(a) printf("%lld\n",(a)) #define Pd(a) printf("%lf\n",(a)) #define Ps(a) printf("%s\n",(a)) #define W(a) while(a--) #define mem(a,b) memset(a,(b),sizeof(a)) #define FOP freopen("data.txt","r",stdin) #define inf 0x3f3f3f3f #define maxn 1000010 #define mod 1000000007 #define PI acos(-1.0) #define LL long long using namespace std; int pre[200010]; int find(int x) { int r=x; while ( pre[r ] != r ) r=pre[r ]; int i=x , j ; while( i != r ) { j = pre[ i ]; pre[ i ]= r ; i=j; } return r ; } void join(int x,int y) { int fx=find(x),fy=find(y); if(fx!=fy) pre[fx ]=fy; } int main() { int T; char c; int n,m,l,r,x; Si(T); while(T--) { Si(n),Si(m); for(int i=1;i<=2*n;i++) { pre[i]=i; } while(m--) { getchar(); scanf("%c%d%d",&c,&l,&r); if(c=='D') { join(l,r+n); join(r,l+n); } else if(c=='A') { if(find(l)==find(r)) { puts("Support the same team."); } else if(find(l)==find(r+n)) { puts("Support different teams."); } else { puts("Not sure yet."); } } } } return 0; }