这里要用multimap来保存数据,然后通过lowerbound与upperbound来查询。
代码如下:
#include<iostream>
#include<map>
using namespace std;
const int maxn=5e5+5;
bool f[maxn];
int n;
struct loc
{
int p,id; //id是学生的编号,目的是为了判断该学生是否被匹配过了
};
multimap<int,loc> s;
void print()
{
multimap<int,loc>::iterator low,up,i,j;
for(i=s.begin();i!=s.end();++i)
{
int a=(*i).first;
loc b=(*i).second;
//cout<<a<<' '<<b.p<<endl;
if(f[b.id]) continue;
low=s.lower_bound(b.p);
up=s.upper_bound(b.p);
if(low==up) //low==up,说明找不到(用区间形式表示为[low,up),当low=up时,这种区间显然不存在)
{
printf("NO\n");
return;
}
else
{
int flag=0;
for(j=low;j!=up;++j)
{
loc c=(*j).second;
if(c.p==a&&!f[c.id])
{
f[c.id]=f[b.id]=1;
flag=1;
break;
}
}
if(!flag)
{
printf("NO\n");
return;
}
}
}
printf("YES\n");
return;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
int a; loc b;
for(int i=1;i<=n;++i)
{
scanf("%d%d",&a,&b.p);
b.id=i;
f[i]=0;
pair<int,loc> p(a,b);
s.insert(p); //multimap的元素是一个pair,所以一定要用pair来插入数据(注意,不能像map一样用[]插入数据)
}//cout<<s.size()<<endl;
if(n%2) //n为奇数肯定没法完成匹配
printf("NO\n");
else print();
s.clear();
}
return 0;
}