区间分组 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的主要内容,如果未能解决你的问题,请参考以下文章

POJ3190 Stall Reservations 贪心

POJ 3190 Stall Reservations贪心

P2859 [USACO06FEB]Stall Reservations S(区间问题,堆)

P2859 [USACO06FEB]Stall Reservations S(区间问题,堆)

差分BZOJ 1651 [Usaco2006 Feb]Stall Reservations 专用牛棚

Stall Reservations