分析
贪心策略:
把牛棚按左端点排序。
如果牛棚的右端点没有牛棚 就添加一个
然后找后面左端点第一个比该右端点大的 放上与该右端点牛相同的牛棚
顺带更新一下ans即可.
我没过样例居然100pts就离谱
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,ans[500001],num;
struct node
{
int s,p;
}a[100001],b[100001];
int cmp(node x,node y)
{
return x.s<y.s;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].s>>b[i].s;
a[i].p=b[i].p=i;
}
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
int j=1;
for(int i=1;i<=n;i++)
{
if(j<=n) j++;
if(!ans[b[i].p]) ans[b[i].p]=++num;
while(a[j].s<=b[i].s&&j<=n) j++;
ans[a[j].p]=ans[b[i].p];
}
cout<<num<<endl;
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<endl;
}
return 0;
}