• P1607 [USACO09FEB]庙会班车Fair Shuttle


    题目描述

    Although Farmer John has no problems walking around the fair to collect prizes or see the shows, his cows are not in such good shape; a full day of walking around the fair leaves them exhausted. To help them enjoy the fair, FJ has arranged for a shuttle truck to take the cows from place to place in the fairgrounds.

    FJ couldn't afford a really great shuttle, so the shuttle he rented traverses its route only once (!) and makes N (1 <= N <= 20,000) stops (conveniently numbered 1..N) along its path. A total of K (1 <= K <= 50,000) groups of cows conveniently numbered 1..K wish to use the shuttle, each of the M_i (1 <= M_i <= N) cows in group i wanting to ride from one stop S_i (1 <= S_i < E_i) to another stop E_i (S_i < E_i <= N) farther along the route.

    The shuttle might not be able to pick up an entire group of cows (since it has limited capacity) but can pick up partial groups as appropriate.

    Given the capacity C (1 <= C <= 100) of the shuttle truck and the descriptions of the groups of cows that want to visit various sites at the fair, determine the maximum number of cows that can ride the shuttle during the fair.

    逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车代步。但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠N(1 ≤N≤20000)个地点(所有地点都以1到N之间的一个数字来表示)。现在奶牛们分成K(1≤K≤50000)个小组,第i 组有Mi(1 ≤Mi≤N)头奶牛,他们希望从Si跑到Ti(1 ≤Si<Ti≤N)。

    由于班车容量有限,可能载不下所有想乘车的奶牛们,此时也允许小里的一部分奶牛分开乘坐班车。约翰经过调查得知班车的容量是C(1≤C≤100),请你帮助约翰计划一个尽可能满足更多奶牛愿望的方案。

    输入输出格式

    输入格式:

     

    【输入】

    第一行:包括三个整数:K,N和C,彼此用空格隔开。

    第二行到K+1行:在第i+1行,将会告诉你第i组奶牛的信息:Si,Ei和Mi,彼

    此用空格隔开。

     

    输出格式:

     

    【输出】

    第一行:可以坐班车的奶牛的最大头数。

     

    输入输出样例

    输入样例#1:
    8 15 3
    1 5 2
    13 14 1
    5 8 3
    8 14 2
    14 15 1
    9 12 1
    12 15 2
    4 6 1
    
    输出样例#1:
    10
    

    说明

    【样例说明】

    班车可以把2头奶牛从1送到5,3头奶牛从5送到8,2头奶牛从8送到14,1头

    奶牛从9送到12,1头奶牛从13送到14,1头奶牛从14送到15。

    题解:贪心+线段树

    按结束点排序 放尽量多的奶牛。

    每次要查询区间最大值 和修改区间最大值 需要线段树维护

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define maxn 200005
    using namespace std;
    
    int k,n,m,ans;
    struct Tree{
        int l,r,sum,s;
    }tr[maxn<<2];
    struct GS{
        int x,y,c;
        bool operator < (const GS &a) const{
            return y<a.y;
        }
    }a[maxn*3];
    
    void pushup(int rt){
        tr[rt].sum=max(tr[rt<<1].sum,tr[rt<<1|1].sum);
        return;
    }
    
    void pushdown(int rt){
        if(!tr[rt].s)return;
        tr[rt<<1].s+=tr[rt].s;tr[rt<<1|1].s+=tr[rt].s;
        tr[rt<<1].sum+=tr[rt].s;tr[rt<<1|1].sum+=tr[rt].s;
        tr[rt].s=0; 
    }
    
    void build(int rt,int l,int r){
        tr[rt].l=l;tr[rt].r=r;
        if(l==r)return;
        int mid=(l+r)>>1;
        build(rt<<1,l,mid);
        build(rt<<1|1,mid+1,r);
    }
    
    int query(int rt,int l,int r,int qx,int qy){
        pushdown(rt);
        if(l>=qx&&r<=qy){
            return tr[rt].sum;
        }
        int mid=(l+r)>>1;
        if(qy<=mid)return query(rt<<1,l,mid,qx,qy);
        else if(qx>mid)return query(rt<<1|1,mid+1,r,qx,qy);
        else return max(query(rt<<1,l,mid,qx,mid),query(rt<<1|1,mid+1,r,mid+1,qy));
    }
    
    void change(int rt,int l,int r,int qx,int qy,int z){
        pushdown(rt);
        if(l>=qx&&r<=qy){
            tr[rt].sum+=z;
            tr[rt].s+=z;
            return;
        }
        int mid=(l+r)>>1;
        if(qy<=mid)change(rt<<1,l,mid,qx,qy,z);
        else if(qx>mid)change(rt<<1|1,mid+1,r,qx,qy,z);
        else change(rt<<1,l,mid,qx,mid,z),change(rt<<1|1,mid+1,r,mid+1,qy,z);
        pushup(rt);
    }
    
    int main(){
        scanf("%d%d%d",&k,&n,&m);
        for(int i=1;i<=k;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
        sort(a+1,a+k+1);
        for(int i=1;i<=k;i++){
            int p=min(a[i].c,m-query(1,1,n,a[i].x,a[i].y-1));
            if(p){
                ans+=p;
                change(1,1,n,a[i].x,a[i].y-1,p);
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    我为能准时下班而做的准备,以及由此的收获,同时总结下不足
    用象棋的思维趣说IT人的职业发展和钱途
    简历上如果出现过于高大上的项目,反而过犹不及:再论如何通过项目引出技术
    用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)
    如果当前没有拿得出手的简历,也别慌,努力的话最多两年情况就能改变
    分析若干没面试机会和没体现实力的简历
    IT人为了自己父母和家庭,更得注意自己的身体和心理健康
    Spring Cloud系列文,Feign整合Ribbon和Hysrix
    以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
    博客园是个大金矿,管理员不挖掘有些可惜:给博客园提一些双赢的建议
  • 原文地址:https://www.cnblogs.com/zzyh/p/7629061.html
Copyright © 2020-2023  润新知