http://acm.hdu.edu.cn/showproblem.php?pid=4268
题意:
Alice和Bob都有n张矩形,长宽都告诉你了。
问你Alice能用多少矩形盖住bob的矩形。 盖住和被盖住的都只能用一次。
POINT:
矩形的长宽会重复,矩形的长宽不能换。
把两堆n个矩形分别按长排序。
然后遍历Alice的矩形,把满足长覆盖的Bob的矩阵全部加入multiset。
然后再这个set里找出宽小于等于这个Alice矩形的最接近的。
#include <set>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 100000+22;
pair<int,int>a[N],b[N];
multiset<int>st;
multiset<int>::iterator it;
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].first,&a[i].second);
for(int i=1;i<=n;i++) scanf("%d%d",&b[i].first,&b[i].second);
sort(a+1,a+1+n);sort(b+1,b+1+n);
st.clear();
int ans=0;
for(int i=1,j=1;i<=n;i++){
while(j<=n&&a[i].first>=b[j].first){
st.insert(b[j].second);
j++;
}
it=st.upper_bound(a[i].second);
if(st.size()>0&&it!=st.begin())
it--;
if(st.size()>0&&*it<=a[i].second){
ans++;
st.erase(*it);
}
}
printf("%d\n",ans);
}
return 0;
}