题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4268
题目大意:就是问你Alice的牌能覆盖Bob牌最多数量。牌不能翻转
思路:首先我们不分种类,把牌按高度排序,然后我们在依次判断牌的种类,如果是Bob的牌,我们就他牌的宽度放入multiset中,如果是Alice的牌就在multiset中找到宽度最大的那一张并删掉。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
const int maxn=200005;
struct Node
{
int h,w,id;
}node[maxn];
bool cmp(Node t1,Node t2)
{
if(t1.h!=t2.h) return t1.h<t2.h;
if(t1.w!=t2.w) return t1.w<t2.w;
return t1.id<t2.id;
}
multiset<int > s;
multiset<int >::iterator ite;
int main()
{
int n,i,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=2*n;i++)
{
scanf("%d%d",&node[i].h,&node[i].w);
node[i].id=(i<=n);
}
sort(node+1,node+2*n+1,cmp);
s.clear();
int sum=0;
for(i=1;i<=2*n;i++)
{
if(node[i].id==0) s.insert(node[i].w);
else
{
if(s.empty()||node[i].w<*(s.begin())) continue;
ite=s.upper_bound(node[i].w); //查找
ite--;
sum++;
s.erase(ite); //删除
}
}
printf("%d\n",sum);
}
return 0;
}