hdu 4268

巨坑无比的题目,有人连样例都过不去还真给他过了,真的坑,这题就姑且看一下,反正很奇怪的贪心,但是不能用pair,因为不能保证全部大于,巨坑

#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;

const int MAX=100000*2+100;
struct rectangular
{
    int h,w,bel;
}Rect[MAX];
multiset<int>MulSet;
multiset<int>::iterator iter;

bool cmp1(rectangular a,rectangular b)
{
    if(a.h!=b.h)
        return a.h<b.h;
    else if(a.w!=b.w)
        return a.w<b.w;
    else 
        return a.bel>b.bel;//保证来一个Alice的方块后它能覆盖的Bob的方块已出现
}


int main()
{
    int cas,i,n,ans;
    cin>>cas;
    while(cas--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&Rect[i].h,&Rect[i].w);
            Rect[i].bel=1;
        }

        for(i=n;i<2*n;i++)
        {
            scanf("%d%d",&Rect[i].h,&Rect[i].w);
            Rect[i].bel=2;
        }

        MulSet.clear();
        ans=0;
        sort(Rect,Rect+2*n,cmp1);
        for(i=0;i<2*n;i++)
        {
            if(Rect[i].bel==1)
            {
                if(!MulSet.empty())
                {
                     iter=MulSet.begin();
                    if(Rect[i].w>=(*iter))
                    {
                        ans++;
                        iter=MulSet.upper_bound(Rect[i].w);//关键字大于Rect[i].w的第一个
                        iter--;//保证删除小于等于Rect[i].w的MulSet中最大的元素
                         MulSet.erase(iter);
                    }
                }
            }
            else
            {
                MulSet.insert(Rect[i].w);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/coolwx/p/11129933.html