Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.
Help FJ by determining:
Help FJ by determining:
- The minimum number of stalls required in the barn so that each cow can have her private milking period
- An assignment of cows to these stalls over time
Line 1: A single integer, N
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Line 1: The minimum number of stalls the barn must have.
Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
5 1 10 2 4 3 6 5 8 4 7
4 1 2 3 2 4
Explanation of the sample:
Here's a graphical schedule for this output:
Here's a graphical schedule for this output:
Time 1 2 3 4 5 6 7 8 9 10 Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>> Stall 2 .. c2>>>>>> c4>>>>>>>>> .. .. Stall 3 .. .. c3>>>>>>>>> .. .. .. .. Stall 4 .. .. .. c5>>>>>>>>> .. .. ..Other outputs using the same number of stalls are possible.
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
#define M 50005
struct node{
int s,e,id;
bool operator <(const node & obj)const //自定义小于号,使得优先队列内元素按e从小到大排序
{
return e>obj.e||(e==obj.e&&s>obj.s);
}
}p[M];
bool comp(const node & obj1,const node &obj2)
{
return obj1.s<obj2.s||(obj1.s==obj2.s&&obj1.e<obj2.e);
}
int n,ans[M];
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++) //p数组记录牛信息
{
scanf("%d%d",&p[i].s,&p[i].e);
p[i].id=i; //记录牛的下标,因为排序会打乱
}
sort(p+1,p+n+1,comp); //将牛的开始时间由小到大排序
int num=1; //num是槽的数量
priority_queue<node> q;
q.push(p[1]); //第一个开始的一定占一个槽
ans[p[1].id]=1; //ans数组记录牛用那个槽
for(i=2;i<=n;i++)
{
if(!q.empty()&&q.top().e<p[i].s)//判定当前牛是否有空余槽可用
{
ans[p[i].id]=ans[q.top().id];
q.pop();
}
else//没有空槽,新加一个,同时这个奶牛应该在新加的槽
{
num++;
ans[p[i].id]=num;
}
q.push(p[i]); //把牛放入槽中
}
printf("%d\n",num);
for(i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}