码迷,mamicode.com
首页 > 其他好文 > 详细

【区间分组】 Stall Reservations

时间:2020-06-18 12:33:01      阅读:43      评论:0      收藏:0      [点我收藏+]

标签:top   否则   names   复杂   def   priority   bool   return   name   

题意

\(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\n",heap.size());
    rep(i,0,n) ans[cow[i].idx] = cow[i].belong;
    rep(i,0,n) printf("%d\n",ans[i]);
}

【区间分组】 Stall Reservations

标签:top   否则   names   复杂   def   priority   bool   return   name   

原文地址:https://www.cnblogs.com/hhyx/p/13156817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!