思路:
分析:对Alice 和Bob的牌都按 h 排序,然后对Alice的每张牌,在Bob的牌中找一个最大能覆盖的 。也就是说首先满足Alice的牌 h >= Bob的牌 h,然后找最大 w。在查找最大的w时,可以使用multiset中的lower_bound。multiset动态插入每次只插入满足Alice的牌 h >= Bob的牌 h 的牌。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
#define MAXN 100001
using namespace std;
multiset<int>ms;
struct SS{int w,h;}A[MAXN],B[MAXN];
bool cmp(SS p,SS q)
{
if(p.w<q.w) return true;
return false;
}
int main()
{
int test,n,i,j,ans;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&A[i].w,&A[i].h);
for(i=0;i<n;i++)
scanf("%d%d",&B[i].w,&B[i].h);
sort(A,A+n,cmp);
sort(B,B+n,cmp);
ms.clear();
ans=0;
multiset<int>::iterator it;
for(i=0,j=0;i<n;i++)
{
for(;j<n&&A[i].w>=B[j].w;j++)
{
ms.insert(B[j].h);
}
if(ms.empty())continue;
it=ms.lower_bound(A[i].h);
if(it==ms.end()||A[i].h<*it) it--;
if(*it<=A[i].h)
{
ans++;
ms.erase(it);
}
}
printf("%d\n",ans);
}
return 0;
}