大题题意为给出交流生所在国家和目标国家,如果A国去B国一个交流生,B国必须也要来A国一个交流生
所有的申请中如果都满足这个条件则输出YES,否则输出NO
数据规模是500000
一开始打算用一个50万的二维数组f[][]来解决这个问题
A->B则f[A][B]++,B->A,f[B][A]++
然后按照主对角线,判断是否相等即可,全相等YES,有一个不相等则NO
然而现象总是美好的,显示确实残酷的,貌似只CB这个编译器就告诉我 too larg.......
//这是几天之后的话
想了想,不需要开50万的数组,因为50万种状态只需要根号50万 * 根号50万, 大约710*710的数组就可以了....
所以也可以用二维数组过
人总是逼出来的,抓掉了无数头发之后,想出了另一个方案
开一个500000的一维数组f,初始化为0,1,2,3……499999,A->B 则swap(f[A],f[B]), B->A 则swap(f[B],f[A])
所有的交换完成后还是该数列则YES,任意一个地方不符合则NO
#include<iostream>
#include<cstdio>
using namespace std;
int f[500000];
int main()
{
int n;
int x, y;
while(cin>>n&&n!=0){
for(int i = 0; i<500000; ++i){
f[i] = i;
}
for(int i = 0; i<n; ++i){
cin>>x>>y;
swap(f[x],f[y]);
}
bool flag = true;
for(int i = 0; i<500000; ++i){
if(f[i] != i){
flag = false;
break;
}
}
printf(flag?"YES\n":"NO\n");
}
return 0;
}