http://acm.hdu.edu.cn/showproblem.php?pid=4268
今天学习了下set,STL真强大。将Alice的card标记为type = 1,Bob的card标记为0。将所
有的纸片按照h,w的升序排序,按照type的降序排序,也就是在相同情况下将Bob的纸片放
前面。然后将Bob的纸片的w插入set,贪心选取Alice比Bob的纸片w大一点的来覆盖
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
const int maxn=200002;
int t,n;
struct node
{
int h,w,type;
bool operator <(const node &b)const
{
if(h != b.h) return h < b.h;
if(w != b.w) return w < b.w;
return type < b.type;
}
} p[maxn];
int main()
{
cin>>t;
while(t--)
{
int i,j,ans=0;
cin>>n;
multiset<int>s;
for(i=0; i<n; i++)
{
scanf("%d%d",&p[i].h,&p[i].w);
p[i].type=1;
}
for(i=n; i<2*n; i++)
{
scanf("%d%d",&p[i].h,&p[i].w);
p[i].type=0;
}
sort(p,p+2*n);
for(i=0;i<2*n;i++)
{
if(p[i].type)
{
if(!s.empty())
{
if(*s.begin()>p[i].w) continue;
multiset<int>::iterator it=s.upper_bound(p[i].w);
it--;
ans++;
s.erase(it);
}
}else
{
s.insert(p[i].w);
}
}
printf("%d\n",ans);
}
return 0;
}