luogu

那个第一次购买有\(s_i\)奖励,可以看成是多一种蔬菜\(i+n\),权值为\(w_i+s_i\),每天减少量\(x\)为0个,保质期\(\lceil\frac{c_i}{x_i}\rceil\),数量为1的蔬菜,同时要把原来的\(c_i\)减一

现在考虑只有一组询问,我们贪心的想,应该先把价值最高的给卖了.所以按照权值从大到小排序.然后当前这种菜显然能在保质期期限内堆在后面卖就在后面卖,这样对后面保质期段的菜更优,那么就是从保质期那天开始往前推,记录能放的菜的数量,每天能放就放,还有就是每往前一天能卖的菜数量增加\(x_i\).为了保证复杂度,应该在这种菜后面没有增加量的时候退出,并且要跳过中间过程卖菜数量满的一些天,这个可以并查集实现,每个点记录这个点往前最近的能卖菜的一天

然后考虑多组询问,先把最大天数的答案求出来,然后从\(i+1\)天的答案推出第\(i\)天的答案.如果后一天总共卖菜的数量\(>i*m\),那么就把卖出去的菜中权值最小的若干个丢掉.正确性,一种菜能在后面的天卖出去,那就更能在前面的天卖出去,所以倒推是合法的

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=2e5+10,lm=1e5;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int ff[N];
int findf(int x){return ff[x]==x?x:ff[x]=findf(ff[x]);}
int n,m,q,w[N],dt[N],rs[N],xx[N],sq[N],sl[N];
LL an[N],smy[N*10],ts;
int gnm(int i,int j){return rs[i]+xx[i]*(dt[i]-j);}
bool cmp(int aa,int bb){return w[aa]>w[bb];} int main()
{
n=rd(),m=rd(),q=rd();
for(int i=1;i<=n;++i)
{
w[i]=rd();
int sd=rd(),nm=rd();
xx[i]=rd();
dt[i]=xx[i]?(nm+xx[i]-1)/xx[i]:lm+1;
rs[i]=dt[i]<=lm?(nm-1)%xx[i]+1:(xx[i]?xx[i]:nm);
dt[i]=min(dt[i],lm);
w[i+n]=w[i]+sd;
dt[i+n]=dt[i],rs[i+n]=1,--rs[i];
}
for(int i=1;i<=lm;++i) ff[i]=i,sl[i]=m;
for(int i=1;i<=n+n;++i) sq[i]=i;
sort(sq+1,sq+n+n+1,cmp);
for(int i=1;i<=n+n;++i)
{
int x=sq[i],nw=findf(dt[x]),bb=0;
while(nw&&bb<gnm(x,1))
{
int aa=gnm(x,nw)-bb,py=min(aa,sl[nw]);
an[lm]+=1ll*py*w[x],bb+=py,sl[nw]-=py;
while(py--) smy[++ts]=w[x];
if(!sl[nw]) ff[nw]=nw-1;
nw=findf(nw-1);
if(x>n) break;
}
}
sort(smy+1,smy+ts+1);
reverse(smy+1,smy+ts+1);
for(int i=lm-1;i;--i)
{
an[i]=an[i+1];
while(ts>i*m) an[i]-=smy[ts--];
}
while(q--) printf("%lld\n",an[rd()]);
return 0;
}

luogu P3826 [NOI2017]蔬菜的更多相关文章

  1. P3826 [NOI2017]蔬菜

    传送门 注意每一单位蔬菜的变质时间是固定的,不随销售发生变化 固定的...... 就是每一个单位的蔬菜在哪一天变质是早就定好了的 发现从第一天推到最后一天很不好搞 考虑反过来,从最后一天推到第一天,这 ...

  2. [NOI2017]蔬菜

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

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

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

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

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

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

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

  6. 4946: [Noi2017]蔬菜

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

  7. [NOI2017]蔬菜 贪心

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

  8. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  9. BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...

随机推荐

  1. Java 实现 2的次幂表示

    问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...

  2. LeetCode 88. 合并两个有序数组(Merge Sorted Array)

    题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  3. pid稳态控制

    https://blog.csdn.net/qq_25352981/article/details/81007075

  4. 小程序API:wx.showActionSheet 将 itemList动态赋值

    1.发现问题: 小程序调用API:wx.showActionSheet 时发现无论如何都不能将其属性itemList动态赋值. 2.分析问题: 首先我认为可能是格式的问题,itemList必须要求格式 ...

  5. JQUERY的$(function(){})和window.onload=function(){}的区别

    在Jquery里面,我们知道入口函数有两种写法:$(function(){}) 和$(document).ready(function(){}) 作用类似于传统JavaScript中的window.o ...

  6. EPOLL内核原理极简图文解读(转)

    预备知识:内核poll钩子原理内核函数poll_wait把当前进程加入到驱动里自定义的等待队列上 当驱动事件就绪后,就可以在驱动里自定义的等待队列上唤醒调用poll的进程 故poll_wait作用:可 ...

  7. MSSQL字符串分割

    CREATE FUNCTION dbo.f_splitstr( @str varchar(8000) )RETURNS @r TABLE(id int IDENTITY(1, 1), value va ...

  8. MATLAB实现OTSU

    目录 1.OTSU算法原理简述: 2.MATLAB实现代码 @ 1.OTSU算法原理简述: 最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法.算法 ...

  9. 学习shell的第三天

    编程原理:1.编程介绍 早期编程:  驱动 硬件默认是不能使用的:   不同的厂家硬件设备之间需要进行指令沟通,我们需要驱动程序来进行“翻译”:  更趋近与硬件开发的工程师,要学习“汇编语言”:而“汇 ...

  10. 第四周课程总结&实验报告(二)

    Java实验报告(二) 实验二 Java简单类与对象 一. 实验目的 (1) 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: (2) 理解类和对象的区别,掌握构造 ...