题目:http://acm.hdu.edu.cn/showproblem.php?pid=4268
很明显的贪心,将两边的矩阵先按h,再按w排个序,对于对于Alice某个矩阵(x, y),在Bob所有x‘ <= x的还没被覆盖的取一个小于等于y的且最接近的y 的,这东西随便写个平衡树或者set就可以了,比赛的时候打错了一点点东西,WA了一次,真不应该.....
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define FORD(i,a,b) for (int i=(a); i>=(b); i--)
#define REP(i,b) FOR(i,0,b)
#define sf scanf
#define pf printf
#define Maxn 100100
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<int>::iterator vit;
int n, ans;
pii a[Maxn], b[Maxn];
multiset<int> s;
int main() {
int T;
sf("%d", &T);
while (T--) {
s.clear();
sf("%d", &n);
REP(i, n) {
sf("%d%d", &a[i].fi, &a[i].se);
}
REP(i, n) {
sf("%d%d", &b[i].fi, &b[i].se);
}
sort(a, a+n);
sort(b, b+n);
int p = 0;
ans = 0;
for (int i = 0; i < n; ++i) {
while (p < n && b[p].fi <= a[i].fi) {
s.insert(b[p].se);
p++;
}
if (s.size() >= 1) {
multiset<int>::iterator it = s.lower_bound(a[i].se);
if (it == s.end()) it--;
if (it != s.begin() && *it > a[i].se) it--;
if (*it <= a[i].se ) {
s.erase(it);
ans++;
}
}
}
pf("%d\n", ans);
}
return 0;
}