思路:优先处理开始时间早,结束时间也早的
做法:贪心按开始时间从小到大排序寻找开始时间最早的,优先队列寻找当前队列中(即已有棚中)结束时间最早的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#define ll long long
using namespace std;
struct node
{
int id,l,r,x;
bool operator<(const node &z)const
{
return r>z.r;
}
}a[50005];
bool cmp1(const node &t1,const node &t2)
{
return t1.l<t2.l;
}
bool cmp2(const node &t1,const node &t2)
{
return t1.id<t2.id;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for(int i=0;i<n;i++)
{
a[i].id=i;
cin >> a[i].l >> a[i].r;
}
sort(a,a+n,cmp1);
a[0].x=1;
int num=1;
priority_queue<node> q;
q.push(a[0]);
for(int i=1;i<n;i++)
{
node t=q.top();
if(a[i].l>t.r)
{
a[i].x=t.x;
q.pop();
q.push(a[i]);
}
else
{
a[i].x=++num;
q.push(a[i]);
}
}
sort(a,a+n,cmp2);
printf("%d\n",num);
for(int i=0;i<n;i++)
printf("%d\n",a[i].x);
return 0;
}