题意:Alice 和Bob各有N个矩形,每个矩形都已自己的高和宽,矩形a能够覆盖矩形b的条件是a.h>=b.h && a.w >= b.w。
问:Alice的矩形最多能覆盖多少个Bob的矩形。(每个矩形只能用一次)
#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
//模拟存放节点信息
struct NODE { int h, w; };
NODE a[200000], b[200000];
int cmp(const void *p1, const void *p2)
{
NODE *p3 = (NODE*)p1; //w升序,h升序
NODE *p4 = (NODE*)p2;
if(p3->w == p4->w)
return p3->h - p4->h;
return p3->w - p4->w;
}
/*
void show(int N)
{
for(int i = 0; i < N; i++)
printf("a[%d].h = %d, a[%d].w = %d\n", i, a[i].h, i, a[i].w);
for(int i = 0; i < N; i++)
printf("b[%d].h = %d, b[%d].w = %d\n", i, b[i].h, i, b[i].w);
}
*/
int main()
{
int T, N;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
int i, j;
for(i = 0; i < N; i++)
scanf("%d%d",&a[i].h, &a[i].w);
for(i = 0; i < N; i++)
scanf("%d%d",&b[i].h, &b[i].w);
qsort(a, N, sizeof(NODE), cmp);
qsort(b, N, sizeof(NODE), cmp);
//show(N);
i = j = 0;
int res = 0;
multiset<int, greater<int> > s;
multiset<int, greater<int> >::iterator it;
for(i = 0; i < N; i++)
{
while(b[j].w <= a[i].w)
{
s.insert(b[j].h);
j++;
}
if(s.empty() == true)
continue;
it = s.lower_bound(a[i].h);
int val = (*it);
if(it != s.end())
{
res++;
it = s.find(val);
s.erase(it);
}
}
printf("%d\n",res);
}
return 0;
}