俩种做法:
一:排序之后二分查找y值区间,进行配对。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<string>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1e6+10;
struct ss
{
int a,b;
}ma[maxn];
int visit[maxn];
int n;
bool cmp(ss x,ss y)
{
if(x.a==y.a)
return x.b<y.b;
return x.a<y.a;
}
int lower_bound(int value)
{
int x=1,y=n;
while(x<y)
{
int m=x+(y-x)/2;
if(ma[m].a>=value)
y=m;
else
x=m+1;
}
return x;
}
int upper_bound(int value)
{
int x=1,y=n;
while(x<y)
{
int m=x+(y-x)/2;
if(ma[m].a<=value)
x=m+1;
else
y=m;
}
return x;
}
int solve()
{
for(int i=1;i<=n;i++)
{
if(visit[i])
continue;
int first=lower_bound(ma[i].b);
int en=upper_bound(ma[i].b);
if(ma[i].b!=ma[first].a)
return 0;
if(en==n)
en++;
for(int j=first;j<en;j++)
{
if(!visit[j]&&ma[i].a==ma[j].b)
{
visit[i]=1;
visit[j]=1;
break;
}
}
}
for(int i=1;i<=n;i++)
{
if(!visit[i])
return 0;
}
return 1;
}
int main()
{
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
scanf("%d%d",&ma[i].a,&ma[i].b);
memset(visit,0,sizeof(visit));
sort(ma+1,ma+1+n,cmp);
int ans=solve();
if(ans)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
二,multimap的使用
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<string>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1e6+10;
multimap<int,int> exchage;
int main()
{
int n;
while(cin>>n&&n)
{
exchage.clear();
for(int i=0;i<n;i++)
{
int from,to;
scanf("%d%d",&from,&to);
int flag=1;
for(multimap<int,int>::iterator i=exchage.find(to);i!=exchage.end()&&i->first==to;++i)
{
if(i->second==from)
{
exchage.erase(i);
flag=0;
break;
}
}
if(flag) exchage.insert(make_pair(from,to));
}
if(exchage.empty()) cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}