小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案。 在蔬菜仓库中,共存放有 n 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各 方面因素,设计合理的销售方案,以获得最多的收益。 在计算销售蔬菜的收益时,每销售一个单位第 i 种蔬菜,就可以获得 ai 的收益。 特别地,由于政策鼓励商家进行多样化销售,第一次销售第 i 种蔬菜时,还会额外 得到 si 的额外收益。 在经营开始时,第 i 种蔬菜的库存为 ci 个单位。 然而,蔬菜的保鲜时间非常有限,一旦变质就不能进行销售,不过聪明的小 N 已 经计算出了每个单位蔬菜变质的时间:对于第 i 种蔬菜,存在保鲜值 xi,每天结束时会 有 xi 个单位的蔬菜变质,直到所有蔬菜都变质。(注意:每一单位蔬菜的变质时间是固 定的,不随销售发生变化) 形式化地:对于所有的满足条件 d × xi ≤ ci 的正整数 d ,有 xi 个单位的蔬菜将在 第 d 天结束时变质。 特别地,若 (d − 1) × xi ≤ ci < d × xi ,则有 ci − (d − 1) × xi 单位的蔬菜将在第 d 天 结束时变质。 注意,当 xi = 0 时,意味着这种蔬菜不会变质。 同时,每天销售的蔬菜总. 量. 也是有限的,最多不能超过 m 个单位。 现在,小 N 有 k 个问题,想请你帮忙算一算。每个问题的形式都是:对于已知的 pj,如果需要销售 pj 天,最多能获得多少收益?

Solution

这题好神,研究了半天题解。

先考虑只有一组询问的情况。

因为一种蔬菜第一次出售和之后再出售价格不同,所以我们把一种蔬菜拆成两个。

这样的话我们就可以按照权值从大到小排序,再贪心就可以了。

对于一种蔬菜,我们可以把它从坏掉的那一天贪心的能放就放(这样肯定是对的,因为那个位置卖后面的东西肯定是不优的).。

然后用并查集维护能卖的天。

还需要注意我们是用了时光倒流的思想,在一开始枚举时候,我们的蔬菜量是坏到那一天时的剩余蔬菜量,再往前跳下一个能卖东西的日子时,要把这段时间内的坏掉的蔬菜加回来。

这就是对于一个询问的操作。

再考虑多组询问。

我们取天数最大的一个询问,对它做一遍贪心,与此同时开两个桶记录每天卖了多少蔬菜和每种蔬菜卖了多少份。

然后我们在缩短时间时维护一个东西,就是对于一天来说最少需要丢掉几个蔬菜,其实就是这一天往后卖的所有蔬菜减去前面还能卖的蔬菜。

然后我们贪心的挑小的丢掉就好了。

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define N 200002
using namespace std;
typedef long long ll;
ll n,m,k,cnt,tong[N],ji[N],tag[N],f[N],a,x,c,s,md,sum,sh[N],to[N],diss[N],zong,ans[N],qe[N],tot;
inline ll rd(){
ll x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return f?-x:x;
}
struct node{
ll val,num,day,x;
bool operator <(const node &b)const{
return val>b.val;
}
}q[N];
int find(int x){return f[x]=f[x]==x?x:find(f[x]);}
int main(){
n=rd();m=rd();k=rd();
for(int i=;i<=n;++i){
a=rd();s=rd();c=rd();x=rd();
q[++tot]=node{a+s,,x?((c-)/x+):1e5,};
c--;
if(c)q[++tot]=node{a,c,x?(c-)/x+:1e5,x};
}
sort(q+,q+tot+);
for(int i=;i<=k;++i)qe[i]=rd(),md=max(md,qe[i]);
for(int i=;i<=md;++i)f[i]=i,tong[i]=m;
for(int i=;i<=tot;++i){
node now=q[i];cnt++;tag[cnt]=now.val;
ll day=find(min(md,now.day));now.num-=(day-)*now.x;
while(now.num&&tong[day]){
int ss=min(tong[day],now.num);
ji[cnt]+=ss;sum+=ss*now.val;tong[day]-=ss;now.num-=ss;
if(!tong[day])f[day]=day-;
ll dd=day;day=find(day-);dd-=day;
now.num+=dd*now.x;
}
if(!find(md))break;
}
for(int i=;i<=md;++i)sh[i]=sh[i-]+tong[i],to[i]=to[i-]+(m-tong[i]);
for(int i=md;i>=;--i)diss[i]=max(0ll,zong-sh[i]),zong+=(m-tong[i]);
for(int i=md;i>=;--i){
ans[i]=sum;
ll tmp=diss[i-]-diss[i];
while(tmp){
x=min(tmp,ji[cnt]);
sum-=tag[cnt]*x;
tmp-=x;ji[cnt]-=x;
if(!ji[cnt]) cnt--;
}
}
for(int i=;i<=k;++i)printf("%lld\n",ans[qe[i]]);
return ;
}

NOI2017蔬菜(贪心)的更多相关文章

  1. [NOI2017]蔬菜 贪心

    题面: [NOI2017]蔬菜 题解: 首先每天蔬菜会变质这点并不好处理,我们考虑让时间倒流,从后向前处理,这样的话就相当于每天都会得到一定量的蔬菜. 这样做有什么好处呢? 我们可以发现一个性质:如果 ...

  2. BZOJ.4946.[NOI2017]蔬菜(贪心 离线)

    题目链接 因为有删除,考虑倒序处理某个p的询问. 那么每天删除xi的蔬菜就变成了每天运来xi的蔬菜.那么我们取当前最优的即可,早取晚取都一样,不需要留给后面取,还能给后面更优的留出空间. 这样就只需考 ...

  3. 【BZOJ4946】[NOI2017]蔬菜(贪心)

    [BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...

  4. bzoj4946: [Noi2017]蔬菜 神烦贪心

    题目链接 bzoj4946: [Noi2017]蔬菜 题解 挺神的贪心 把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚 按价格排序后,贪心的往前面可以填的位置填就可以了.找可 ...

  5. [NOI2017]蔬菜

    [NOI2017]蔬菜 题目描述 大意就是有\(n\)种物品,第\(i\)个物品有\(c_i\)个,单价是\(a_i\).然后每天你可以卖出最多\(m\)个物品.每天结束后第\(i\)种物品会减少\( ...

  6. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

  7. 4946: [Noi2017]蔬菜

    4946: [Noi2017]蔬菜 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 分析: 贪心. 首先可以将一个蔬菜拆成两个,一个是有加成 ...

  8. BZOJ4946 NOI2017蔬菜(贪心+堆)

    容易想到一个费用流做法:将每种蔬菜拆成p种,对应p个过期时间,每一种向可以卖的时间连边,第一次卖的奖励算在最晚过期的一种里.对于天数动态加点.不过这样边数太多了,因为第i天能卖的第i-1天一定能卖,可 ...

  9. uoj318 [NOI2017]蔬菜 【贪心 + 堆 + 并查集】

    题目链接 uoj 题解 以前看别人博客,在考场上用费用流做,一直以为这题是毒瘤网络流题 没想到竟然是贪心模拟题... 如果只有一个蔬菜呢?这就是一个经典的普及难度的贪心,正着推面临优先选择的困难,而逆 ...

随机推荐

  1. bootstrap 弹窗或者提示框插件 bootstrap-growl 和bootstrap-notify

    Bootstrap简单好用的页面右上角咆哮提示框 - daidaineteasy的专栏 - CSDN博客https://blog.csdn.net/daidaineteasy/article/deta ...

  2. jenkins 迁移后 提示 反向代理设置有误

    jenkins报:反向代理设置有误-布布扣-bubuko.comhttp://www.bubuko.com/infodetail-2038758.html [Linux][Jenkins]系统配置报反 ...

  3. fiddler查看IP地址和请求响应时间

    (一)fiddler查看IP地址 1.点击菜单栏rules——customize rules… 2.ctrl+f搜索“static function main” 3.在main函数里加入下面一行代码, ...

  4. 关于微信小程序使用canvas生成图片,内容图片跨域的问题

    最近有个项目是保存为名片(图片),让用户发送给朋友或朋友圈,找了很多方案都不适用,绞尽脑汁之后还是选了使用canvas,但是用这玩意儿生成图片最大的缺点就是,如果你的内容中有图片,并且这个图片是通过外 ...

  5. JSON for-in 遍历

    (代码均以js代码示例) 1.可以使用 for-in 来循环对象的属性,使用中括号([])来访问属性的值: 这中方法便于一些在不确定有属性的情况下使用. var myObj = { "nam ...

  6. Prime Permutation

    Prime Permutation 原题地址: http://codeforces.com/problemset/problem/123/A 题目大意: 给你一个字符串(只包含小写字母),从1开始存放 ...

  7. Linux安装jdk环境

    前言: 又重新起了一个CentOS7,里面什么都没有,翻出以前CentOS7安装jdk的笔记,现在已经弃用有道云了,用博客比较多,所以把它移过来. 有道云笔记地址(CentOS7安装1.8jdk):h ...

  8. logback框架之——日志分割所带来的潜在问题

    源码: logback-test.xml文件如下,有2个需要我们重点关注的参数: fileNamePattern:这里的日志文件名变动的部分是年月日时,外加1个文件分割自增变量,警告,年月日时的数值依 ...

  9. 如何在TypeScript中使用第三方JavaScript框架

    一.安装typings 使用npm全局安装typings :npm install -g typings 安装成功. 二,搜索资源,支持模糊搜索:typings search base64 三.安装t ...

  10. python之路--初识面向对象

    一 . 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大 ...