题意: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; }