解题思路:用两个vector容器分别储存输入的两个值,然后通过set储存所有不同的元素,通过set遍历所有元素,
vec1[*iter]下标表示交换的学校(A, B)。看了下网上有个反列(10 20 20 30 30 10)所以在最后判断处添加了(n%2==0)偶数个人才能交换。
- #include<cstdio>
- #include<vector>
- #include<set>
- using namespace std;
- const int maxn=500000+10;
- vector<int>vec1[maxn],vec2[maxn];
- set<int>set1;
- int main(){
- int n;
- while(scanf("%d",&n)==1 && n){
- for(int i=0;i<n;i++){
- int t1,t2;
- scanf("%d%d",&t1,&t2);
- vec1[t1].push_back(1);
- vec2[t2].push_back(1);
- set1.insert(t1);
- set1.insert(t2);
- }
- int flag=1;
- for(set<int> ::iterator iter=set1.begin();iter!=set1.end();iter++){
- if(vec1[*iter].size()!=vec2[*iter].size())
- {flag=0;
- break;
- }
- }
- if(flag && n%2==0)printf("YES\n");
- else printf("NO\n");
- for(set<int> ::iterator iter=set1.begin();iter!=set1.end();iter++){
- vec1[*iter].clear();
- vec2[*iter].clear();
- }
- set1.clear();
- }
- return 0;
- }
如有错误,欢迎指出,谢谢!