目录:
题目:
分析:
我们先对每只牛的起始时间排序,再用一个小根堆维护结束时间。
然后枚举每一只牛,当小根堆的堆顶的结束时间在当前牛的起始时间之前,那么我们就把这只牛放入堆顶的摊位。否则就新建一个。
代码:
#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;
}