HDU 4268 Alice and Bob 贪心+set应用

来源:互联网 发布:舒达床垫 淘宝 编辑:程序博客网 时间:2024/06/05 04:29

题意:alice和bob分别有n(n<=100000)个长宽为a b的矩形(a b不能调换位置),如果alice中矩形i和bob的矩形j有i.a >= j.a && i.b >= j.b那么i就能覆盖住j,
         问最多alice鞥覆盖住bob的多少个矩形。

题解:这题比赛的时候一点想法也没有呢唉。

         排序后双指针扫描,将bob里面所有a<=i.a(alice当前的举行)的j.b都放到set中,然后每次找与i.b最接近的b从set中删除,统计答案。

Sure原创,转载请注明出处。

#include <iostream>#include <cstdio>#include <set>#include <algorithm>#include <memory.h>using namespace std;const int maxn = 100002;struct node{    int a,b;    bool operator < (const node &other) const    {        if(a == other.a)        {            return b < other.b;        }        return a < other.a;    }}alice[maxn],bob[maxn];multiset <int> s;int n;void read(){    s.clear();    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d %d",&alice[i].a,&alice[i].b);    }    for(int i=0;i<n;i++)    {        scanf("%d %d",&bob[i].a,&bob[i].b);    }    sort(alice , alice + n);    sort(bob , bob + n);    return;}void solve(){    int cnt = 0;    int j = 0;    for(int i=0;i<n;i++)    {        while(j < n && bob[j].a <= alice[i].a)        {            s.insert(bob[j].b);            j++;        }        if(s.size() < 1) continue;        multiset<int>::iterator it = s.lower_bound(alice[i].b);        if(it != s.begin() && (it == s.end() || *it > alice[i].b))        {            it--;        }        if(*it <= alice[i].b)        {            s.erase(it);            cnt++;        }    }    printf("%d\n",cnt);    return;}int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {        read();        solve();    }    return 0;}

原创粉丝点击