POJ P3190 Stall Reservations

目录:


题目:

传送门


分析:

我们先对每只牛的起始时间排序,再用一个小根堆维护结束时间。
然后枚举每一只牛,当小根堆的堆顶的结束时间在当前牛的起始时间之前,那么我们就把这只牛放入堆顶的摊位。否则就新建一个。


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
//c++自带堆
struct node{
    int b,e,id;
    bool operator<(const node &a)const
    {return e>a.e;}
}e[50001];
priority_queue<node> q;
int ans[50001];
bool cmp(node x,node y)
{
    return x.b<y.b;
}
int main()
{
    int n=read();
    for(int i=1;i<=n;i++)
    {
        e[i].b=read();e[i].e=read();e[i].id=i;
    }
    sort(e+1,e+1+n,cmp);
    int len=1;
    q.push(e[1]);ans[e[1].id]=1;
    for(int i=2;i<=n;i++)
    {
        if(q.size()>0&&q.top().e<e[i].b)
        {
            ans[e[i].id]=ans[q.top().id];
            q.pop();
        }
        else
        {
            ans[e[i].id]=++len;
        }
        q.push(e[i]);
    }
    printf("%d\n",len);
    for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35786326/article/details/81664242