【JZOJ5043】【NOI2017模拟4.4】保持平衡

55 篇文章 0 订阅
5 篇文章 0 订阅

Description

博爱路上种起了一棵棵的大树,但是有一些地方的树超过了负荷,有一些地方的树的数量又不够。
我们不妨把博爱路看做一条数轴,数轴有n个点,从1到n编号,第i个位置原来现在有ai棵树,这个位置的需求是bi棵树。ai,bi都是0到10的整数。由于你需要是这个位置的树的数量保持平衡,所以你需要移除或者搬一些树过来。
我们怎么使树的数量平衡呢?
首先,你可以从某个位置i移动一棵树到位置j,这时,你需要的运费是|i-j|*z元。
其次,你可以从商店买一棵树,需要支付x元,这时商店会把树配送到任意位置。
还有就是,你可以叫别人收购在任意位置一棵树,需要支付y元运费。
问使得树的数量平衡最小需要支付多少钱?

Data Constraint

这里写图片描述

Solution

这是一道用堆维护的神奇题目。
我们考虑从前往后做,那运送的费用就拆解为i* z-j*z,我们将i *z,-j*z分别寄存在i和j上。维护两个堆f,f1分别表示多出树的堆和少树的堆。我们这里只讨论少树的情况。对于少树,我们从堆f中取出一个最小值,假如它比y小,就说明把以前的树移过来划算,我们就把它加入答案,并把它踢出堆,否则就说明当前代价还不如自己去买棵树划算,就把y加入答案。设你假如答案的数为t,那么为了考虑到将来有可能撤销这次操作,我们就将-i*z-t加入到堆f1。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
struct code{
    ll a;
    bool friend operator < (code x,code y){
        return !(x.a<y.a);
    }
}g,g1;
priority_queue<code>f,f1;
ll n,x,y,z,p,q,i,t,j,k,l,ans;
int main(){
    freopen("data.in","r",stdin);//freopen("balance.out","w",stdout);
    scanf("%lld%lld%lld%lld",&n,&x,&y,&z);
    for (i=1;i<=n;i++){
        scanf("%lld%lld",&p,&q);
        p-=q;
        while (p>0){
            if (!f.empty()){
                g=f.top();
                if (i*z+g.a<y) t=i*z+g.a,f.pop();
                else t=y;
            }else t=y;
            g1.a=-i*z-t,f1.push(g1);
            ans+=t;
            p--;
        }
        while (p<0){
            if (!f1.empty()){
                g=f1.top();
                if (i*z+g.a<x) t=i*z+g.a,f1.pop();
                else t=x;
            }else t=x;
            g1.a=-i*z-t,f.push(g1);
            ans+=t;
            p++;
        }
    }
    printf("%lld\n",ans);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值