区间分组 Stall Reservations
Posted hhyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间分组 Stall Reservations相关的知识,希望对你有一定的参考价值。
题意
(n)头牛,每头牛有一个开始吃草的时间和结束吃草的时间,当两头牛之间存在交点的时候,
这两头牛不能安排在同一个畜栏吃草,求需要的最小畜栏数目和每头牛对应的畜栏方案
贪心步骤:
(1)将所有牛按开始吃草的时间排序;
(2)用小根堆维护当前所有畜栏的最后一头牛的吃草结束时间;
(3)如果当前的牛可以安排在右边界最小的中,则将其安排进去,否则最小的都加不进去其他的更不可能加进去,入堆即可;
需要保存排序前的下标最后再映射回去按照原来的下标输出答案。
时间复杂度:
排序 (O(nlogn)),依次枚举每头牛的过程中,只涉及到常数次堆的操作,时间复杂度至多是 (O(logn))
所以总时间复杂度是 (O(nlogn))
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define ll long long
#define fi first
#define se second
typedef pair<int,int> pii;
const int N=5e4+10;
int n;
int ans[N];
struct Node{
int l,r;
int idx,belong;
bool operator <(const Node &x)const {
return l<x.l;
}
}cow[N];
priority_queue<pii,vector<pii>,greater<pii>>heap;
int main(){
scanf("%d",&n);
rep(i,0,n) {
scanf("%d%d",&cow[i].l,&cow[i].r);
cow[i].idx=i;
}
sort(cow,cow+n);
rep(i,0,n){
int num=heap.size();
if(num && cow[i].l > heap.top().fi){
int t = cow[i].belong=heap.top().se;
heap.pop();
heap.push({cow[i].r,t});
continue;
}
cow[i].belong=++num;
heap.push({cow[i].r,num});
}
printf("%d
",heap.size());
rep(i,0,n) ans[cow[i].idx] = cow[i].belong;
rep(i,0,n) printf("%d
",ans[i]);
}
以上是关于区间分组 Stall Reservations的主要内容,如果未能解决你的问题,请参考以下文章
P2859 [USACO06FEB]Stall Reservations S(区间问题,堆)
P2859 [USACO06FEB]Stall Reservations S(区间问题,堆)