贪心+数据结构
看了题解,研究了一下set,按着题解思路打了一遍
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
struct node
{
int height;
int width;
}alice[100005],bob[100005];
multiset<int> str;
bool cmp(node a,node b)
{
if(a.height<b.height)
return true;
else if(a.height==b.height)
{
return a.width<b.width;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&alice[i].height,&alice[i].width);
}
for(int i=1;i<=n;i++)
{
scanf("%d%d",&bob[i].height,&bob[i].width);
}
sort(alice+1,alice+n+1,cmp);
sort(bob+1,bob+n+1,cmp);
int ans=0;
int len=1;
for(int i=1;i<=n;i++)
{
while(len<=n&&bob[len].height<=alice[i].height)
{
str.insert(bob[len].width);
len++;
}
if(str.size()>=1)
{
multiset<int>::iterator it=str.lower_bound(alice[i].width);
if(it==str.end())
it--;
if(it!=str.begin()&&*it>alice[i].width)
it--;
if((*it)<=alice[i].width)
{
ans++;
str.erase(it);
}
}
}
printf("%d\n",ans);
str.clear();
}
}