有N头牛在畜栏中吃草。
每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏。
给定N头牛和每头牛开始吃草的时间A以及结束吃草的时间B,每头牛在[A,B]这一时间段内都会一直吃草。
当两头牛的吃草区间存在交集时(包括端点),这两头牛不能被安排在同一个畜栏吃草。
求需要的最小畜栏数目和每头牛对应的畜栏方案。
输入格式
第1行:输入一个整数N。
第2..N+1行:第i+1行输入第i头牛的开始吃草时间A以及结束吃草时间B,数之间用空格隔开。
输出格式
第1行:输入一个整数,代表所需最小畜栏数。
第2..N+1行:第i+1行输入第i头牛被安排到的畜栏编号,编号从1开始,只要方案合法即可。
数据范围
1≤N≤50000,
1≤A,B≤1000000
输入样例:
5 1 10 2 4 3 6 5 8 4 7
输出样例:
4 1 2 3 2 4
本题主要考察的是区间分组的知识点
有关知识点请见:https://www.cnblogs.com/myhnb/p/11243677.html
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N = 5*1e4+10;
priority_queue<pii,vector<pii>,greater<pii> > g;
pair<pair<int,int>,int> p[N];
int d[N];
int n,cnt;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
p[i].second=i;
scanf("%d%d",&p[i].first.first,&p[i].first.second);
}
sort(p+1,p+n+1);
cnt=1;
g.push(make_pair(p[1].first.second,1));
d[p[1].second]=1;
for(int i=2;i<=n;i++)
{
if(p[i].first.first<=g.top().first)
{
g.push(make_pair(p[i].first.second,++cnt));
d[p[i].second]=cnt;
}
else
{
int now=g.top().first,z=g.top().second;
g.pop();
now=max(now,p[i].first.second);
g.push(make_pair(now,z));
d[p[i].second]=z;
}
}
printf("%d
",g.size());
for(int i=1;i<=n;i++)printf("%d
",d[i]);
return 0;
}