zoukankan      html  css  js  c++  java
  • 【区间分组】 Stall Reservations

    传送门

    题意

    (n)头牛,每头牛有一个开始吃草的时间和结束吃草的时间,当两头牛之间存在交点的时候,
    这两头牛不能安排在同一个畜栏吃草,求需要的最小畜栏数目和每头牛对应的畜栏方案

    数据范围

    (egin{array}{l}1 leq N leq 50000 \ 1 leq A, B leq 1000000end{array})

    题解

    贪心步骤:
    (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]);
    }
    
  • 相关阅读:
    Cookie、Session和自定义分页
    logstash 运行
    php json数据保留原样中文
    linux 32位还是64位
    php之isset 与 empty 区别
    php 订单
    个人分类
    laravel 创建自己的函数
    lumen框架导入数据异常
    yum安装samba服务器的安装
  • 原文地址:https://www.cnblogs.com/hhyx/p/13156817.html
Copyright © 2011-2022 走看看