首页 > ACM题库 > HDU-杭电 > HDU 4268-Alice and Bob-计算几何-[解题报告]HOJ
2015
05-23

HDU 4268-Alice and Bob-计算几何-[解题报告]HOJ

Alice and Bob

问题描述 :

Alice and Bob’s game never ends. Today, they introduce a new game. In this game, both of them have N different rectangular cards respectively. Alice wants to use his cards to cover Bob’s. The card A can cover the card B if the height of A is not smaller than B and the width of A is not smaller than B. As the best programmer, you are asked to compute the maximal number of Bob’s cards that Alice can cover.
Please pay attention that each card can be used only once and the cards cannot be rotated.

输入:

The first line of the input is a number T (T <= 40) which means the number of test cases.
For each case, the first line is a number N which means the number of cards that Alice and Bob have respectively. Each of the following N (N <= 100,000) lines contains two integers h (h <= 1,000,000,000) and w (w <= 1,000,000,000) which means the height and width of Alice’s card, then the following N lines means that of Bob’s.

输出:

The first line of the input is a number T (T <= 40) which means the number of test cases.
For each case, the first line is a number N which means the number of cards that Alice and Bob have respectively. Each of the following N (N <= 100,000) lines contains two integers h (h <= 1,000,000,000) and w (w <= 1,000,000,000) which means the height and width of Alice’s card, then the following N lines means that of Bob’s.

样例输入:

2
2
1 2
3 4
2 3
4 5
3
2 3
5 7
6 8
4 1
2 5
3 4 

样例输出:

1
2

题目大意:

Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形?

 (N <= 100,000)

题解:

先按照x排序,先保证在x满足条件的情况下,对b[i].y(Bob)进行查找,找到最接近a[i].y(Alice)的值,删除他。

总之就是先保证一维有序这样可以O(n)枚举,另一维再查找。

#include<iostream>
#include<set>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
multiset<int> myset;
multiset<int>::iterator it;
const int maxn=200000;
struct node
{
    int x,y;
    bool operator<(const node& b)const
    {
        return x<b.x;
    }
}a[maxn],b[maxn];
int main()
{
    int sec,n;
    scanf("%d",&sec);
    for(int z=1;z<=sec;z++)
    {
        myset.clear();
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
        for(int i=1;i<=n;i++)
        scanf("%d%d",&b[i].x,&b[i].y);
        sort(a+1,a+1+n);//按x从小到大排序
        sort(b+1,b+1+n);//按x从小到大排序
        int j=1;int ans=0;//j是一个指向B数组位置的指针
        for(int i=1;i<=n;i++)
        {
            while(j<=n&&b[j].x<=a[i].x)
            {
                myset.insert(b[j].y);
                j++;
            }
            it=myset.upper_bound(a[i].y);
            if(myset.size()>0&&it!=myset.begin())it--;
            if(myset.size()>0&&(*it)<=a[i].y)
            {
                ans++;
                myset.erase(it);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

参考:http://blog.csdn.net/hyogahyoga/article/details/7958722