先对每头牛进行从早到晚的排序。
由于需要为每个牛分配牛棚并输出,维护一个数组t表示第i头牛位于哪一个牛棚。
维护一个以结束时间为标准从小到大的优先队列,每次提取出最早结束的牛棚,判断是否可用,如果可用的话标记,不可用则新建一个牛棚。
最后输出即可。
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 50000 + 5;
struct itv
{
int idx;
int begin;
int end;
bool operator < (const itv &a) const {
return end > a.end;
}
};
itv cow[MAXN];
int stall[MAXN];
priority_queue<itv> que;
bool comp(itv a, itv b)
{
return a.begin < b.begin;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
cow[i].idx = i;
scanf("%d%d", &cow[i].begin, &cow[i].end);
}
sort(cow, cow + n, comp);
int ans = 1;
que.push(cow[0]);
stall[cow[0].idx] = ans;
for (int i = 1; i < n; i++) {
if (!que.empty() && que.top().end < cow[i].begin) {
stall[cow[i].idx] = stall[que.top().idx];
que.pop();
}
else {
ans++;
stall[cow[i].idx] = ans;
}
que.push(cow[i]);
}
printf("%d\n", ans);
for (int i = 0; i < n; i++) {
printf("%d\n", stall[i]);
}
return 0;
}