思路:
因爲問是最少要多少個地方纔能安排好所有牛,所以對於牛按照開始時間升序 開始時間一樣按結束時間升序
我們考慮把每頭牛丟進去,當前這頭牛進去的話 把這頭牛的開始時間與已經進去的牛的最早結束的時間比較,如果結束時間>最早結束的時間 那麼就是一頭牛代替另一頭牛進去,那麼自然所需要的個數就不變,如果開始時間≤最早結束的時間,那麼我們需要新開闢一個地方,讓這頭牛進去。
綜上所述 我們是需要一個可以支持自動排序 、插入、刪除的數據結構 自然是優先隊列了
維護一個以結束時間的小根堆即可
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
int s,e,id;
}a[500005];
struct nodee
{
int e,id;
friend bool operator<(nodee a,nodee b){ ///以結束時間的小根堆
return a.e>b.e;
}
};
bool cmp(node a,node b){
return a.s==b.s?a.e<b.e:a.s<b.s;
}
int ans[500005];
int main(){
ios::sync_with_stdio(0);
int n;
while(cin>>n){
for(int i=1;i<=n;i++) cin>>a[i].s>>a[i].e,a[i].id=i;
sort(a+1,a+1+n,cmp);///對牛的開始和結束時間進行升序
priority_queue<nodee> q;
q.push({a[1].e,1});
ans[a[1].id]=1;
int cnt=1;
for(int i=2;i<=n;i++){
nodee now=q.top();
if(now.e>=a[i].s){///最先結束的時間 ≥ 當前的開始時間 要新加一個
ans[a[i].id]=++cnt;
q.push({a[i].e,cnt});
}
else///一頭牛出來 當前這頭進去
{
q.pop();
ans[a[i].id]=now.id;///存這頭牛進入的編號
q.push({a[i].e,now.id});
}
}
cout<<cnt<<endl;
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
}
return 0;
}