问题描述
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
第一次我想的是每次和最晚开始的、最早结束的比较,后来发现其实这样是不够的,所以必须得先排序。
先根据开始的时间排成升序,把第一个放入一个优先队列,而这个优先队列是根据结束的时间来排的,然后每次和队列的top比较,因为开始的时间已经比top大了,所以直接比较开始的时间和top元素结束的时间,如果大于top元素结束的时间,那么就可以在同一个stall中,如果小于,那么时间发生冲突,就能待在另一个新的stall中,然后把这个push进队列。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
int x,y,num;
}no[50005];
int used[50005];
bool operator<(node a,node b)
{
return a.y>b.y;
}
bool cmp(node a,node b)
{
return a.x<b.x;
}
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&no[i].x,&no[i].y);
no[i].num=i+1;
}
sort(no,no+n,cmp);
int ans=1;
priority_queue <node> que;
que.push(no[0]);
used[no[0].num]=1;
for(int i=1;i<n;i++)
{node a=que.top();
if(no[i].x>a.y)
{
que.pop();
que.push(no[i]);
used[no[i].num]=used[a.num];
}
else
{
ans++;
que.push(no[i]);
used[no[i].num]=ans;
}
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
printf("%d\n",used[i]);
}