Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3046 Accepted Submission(s): 995
题目大意:
这道题就是说,给你2组含有n个不同大小的矩形块,要去A的矩形块能够完全覆盖B的矩形块,且每个矩形块只能用一次.
求最多能有多少个矩形被覆盖.
解题思路:
一开始少看了一个0,想用O(n2)试试,看看数据水不水,结果,果断的T掉了。
其实呢,这道题就是一个有关multiset的应用,我们只要对于a和b两个数组按照w的从小到大排序后,依次在b[]中小于a[].w的
加入到multiset中去,因为加入的条件已经满足了w的大小关系,现在我们就用multiset中的成员函数upper_bound去寻找到第
一个比a[i].h大的下标,然后把这个下标以前的全部剪掉,就是我们所有要找到的满足条件的方案数目了。
切记,每次使用完multiset后,都要clear下,要不然会对后面的计算产生不必要的结果.
代码:
1 # include<cstdio> 2 # include<iostream> 3 # include<set> 4 # include<algorithm> 5 6 using namespace std; 7 8 # define MAX 100000+4 9 10 multiset<int>ms; 11 12 struct node 13 { 14 int w,h; 15 }a[MAX],b[MAX]; 16 17 int cmp1 ( const struct node & xx, const struct node & yy ) 18 { 19 if ( xx.w==yy.w ) 20 return xx.h < yy.h; 21 return xx.w < yy.w; 22 } 23 24 25 int main(void) 26 { 27 int t;scanf("%d",&t); 28 while ( t-- ) 29 { 30 int n;scanf("%d",&n); 31 for ( int i = 0;i < n;i++ ) 32 { 33 scanf("%d%d",&a[i].w,&a[i].h); 34 } 35 for ( int i = 0;i < n;i++ ) 36 { 37 scanf("%d%d",&b[i].w,&b[i].h); 38 } 39 sort(a,a+n,cmp1); 40 sort(b,b+n,cmp1); 41 int ans = 0; 42 multiset<int>::iterator it; 43 for ( int i = 0, j = 0;i < n;i++ ) 44 { 45 while ( j < n&&b[j].w<=a[i].w ) 46 { 47 ms.insert(b[j].h); 48 j++; 49 } 50 it = ms.upper_bound(a[i].h); 51 if ( it!=ms.begin() ) 52 { 53 it--; 54 ms.erase(it); 55 ans++; 56 } 57 58 } 59 ms.clear(); 60 printf("%d\n",ans); 61 } 62 63 return 0; 64 }