先按h从小到大排序,查找离w最近的值,删除他
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
#define N 100010
multiset<int> myset;
multiset<int>::iterator it;
int n,m;
struct node
{
int h,w;
bool operator <(const node &b) const
{
return h<b.h;
}
}a[N],b[N];
int main()
{
int i,j,cas,ans;
scanf("%d",&cas);
while(cas--)
{
myset.clear();
scanf("%d",&n);
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);
}
sort(a,a+n);
sort(b,b+n);
i=0;j=0;ans=0;
while(i<n)
{
while(j<n&&a[i].h>=b[j].h)
{
myset.insert(b[j].w);
j++;
}
it=myset.upper_bound(a[i].w);
if(!myset.empty())
{
if(it!=myset.begin())
it--;
if(*it<=a[i].w)
{
ans++;
myset.erase(it);
}
}
i++;
}
printf("%d\n",ans);
}
return 0;
}