这道题容易想到用贪心做。
首先肯定要排序,
之后会发现当一个奶牛的左区间边界大于另一个奶牛的右区间边界就可以共用一个畜栏。
这样暴力做是 O ( n 2 ) O(n^2) O(n2),发现可以用小根堆来维护右区间边界。
则时间复杂度可以优化成 O ( n log n ) O(n\log n) O(nlogn)。
#include
#include
#include
#include
#include
using namespace std;
int anss[100010],js;
int n,ans,c;
priority_queue<int>q;
struct node
{
int a,b[2];
}fi[1000010];
bool cmp(const node&f,const node&c)
{
return f.a<c.a;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d%d",&fi[i].a,&fi[i].b[0]);
sort(fi+1,fi+1+n,cmp);
for(int i=1; i<=n; i++)
{
fi[fi[i].b[0]].b[1]=i; //存储位置,以便输出共用畜栏时的序号
q.push(-fi[i].b[0]);
if(fi[i].a<=-q.top()) //一个奶牛的左区间边界不大于另一个奶牛的右区间边界
ans++,c++,anss[++js]=c;
else //一个奶牛的左区间边界大于另一个奶牛的右区间边界
{
anss[++js]=fi[-q.top()].b[1];
q.pop();
}
}
cout<<ans<<endl;
for(int i=1; i<=n; i++)
cout<<anss[i]<<endl;
return 0;
}