题意:n个学生要当交换生,每个学生想从A校换到B校,交换条件是找到一个想要从B换到A的学生配对,每个学生只能配对一次,问这些学生能不能都成功交换。
思路:这题挺简单的,首先是配对的问题,由于对于每个学生,A和B是不同的,因此可以把学生分成两组,一组是A<B的,一组是A>B的,这样能配对的组合一定是第一组和第二组的两个学生,那么把这两个集合排序,然后依次看能否匹配即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=500000+10;
struct Node
{
int x,y;
Node (){};
Node (int xx,int yy){x=xx;y=yy;}
};
Node S[maxn],T[maxn];
bool cmp1(Node a,Node b)
{
return (a.x==b.x&&a.y<b.y)||(a.x<b.x);
}
bool cmp2(Node a,Node b)
{
return (a.y==b.y&&a.x<b.x)||(a.y<b.y);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m1,m2;
while(~scanf("%d",&n))
{
if(n==0) break;
bool flag=true;
m1=m2=0;
int xx,yy;
for(int i=0;i<n;++i)
{
scanf("%d%d",&xx,&yy);
if(xx<yy) S[m1++]=Node(xx,yy);
else T[m2++]=Node(xx,yy);
}
if(m1!=m2) flag=false;
else
{
sort(S,S+m1,cmp1);
sort(T,T+m1,cmp2);
for(int i=0;i<m1;++i)
if(S[i].x!=T[i].y||S[i].y!=T[i].x)
{flag=false;break;}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}