https://www.lydsy.com/JudgeOnline/problem.php?id=4946

https://www.luogu.org/problemnew/show/P3826

http://uoj.ac/problem/318

题意看原题……

不得不说是一道十分妙的题,辛酸史放在后面讲。

参考:noi2017知乎上lzz的题解,洛谷上唯一一篇题解。

lzz的算法不太好理解啊……于是copy的洛谷题解。

看到如此乱七八糟的题目限制很容易想到费用流,但是数据范围告诉我们显然不可以网络流。

有着众多解题经验的我们得知:万物皆网络流,网络流皆贪心。

先思考网络流怎么建,一种可行方案为将时间从P~1连边,每个时间向T连m容量边,S向每种水果每个变质时间连变质水果数量。

实际上我们把时间倒序之后就变成了有多少水果会在第几天出现,并且永远不腐。

再考虑每天也就能拿m个,贪心来讲反正后面水果也不腐,不拿白不拿,直接把当天所有水果挑选最贵的m个卖了即可。

于是我们不难求出时间为P的答案——通过一个优先队列。

但是显然以这种速度处理所有的询问是不可取的,思考有没有一种推法能够将ans[P]推到ans[P-1]去呢?

显然是有的,思考时间的提前会将原本在P运来的水果提前至P-1天运来,于是这P-1天的可选水果并没有变,对前P-1天唯一的变化就是我们可以用贵水果替换掉便宜水果,因此剩下来卖不了的水果一定是原本选择的水果中最便宜的几个。

继续优先队列将我们选过的水果放里面,弹出最小的几个使得我们选的水果数量为(P-1)*m即可。

总结就是一道好题,思维含量巨大,代码实现比较简单,洛谷评为黑题也没有任何问题。

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+;
const int P=1e5;
inline ll read(){
ll X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct veg{
ll v;int i;
};
struct cmp1{
bool operator ()(veg a,veg b){return a.v<b.v;}
};
struct cmp2{
bool operator ()(veg a,veg b){return a.v>b.v;}
};
priority_queue<veg,vector<veg>,cmp1>q;
priority_queue<veg,vector<veg>,cmp2>p;
queue<veg>tmp;
ll a[N],s[N],c[N],x[N],g[N],ans[P+],tot;
int n,m,k;
vector<int>sold[P+];
int main(){
n=read(),m=read(),k=read();
for(int i=;i<=n;i++){
a[i]=read(),s[i]=read(),c[i]=read(),x[i]=read();
if(x[i])sold[min((ll)P,(c[i]+x[i]-)/x[i])].push_back(i);
else sold[P].push_back(i);
}
for(int i=P;i>=;i--){
for(int j=;j<sold[i].size();j++){
q.push((veg){a[sold[i][j]]+s[sold[i][j]],sold[i][j]});
}
ll lim=m;
while(lim&&!q.empty()){
veg f=q.top();q.pop();
if(!g[f.i]){
ans[P]+=f.v;g[f.i]++;lim--;
if(g[f.i]<c[f.i])q.push((veg){a[f.i],f.i});
}else{
ll delta=min((ll)lim,c[f.i]-g[f.i]-(i-)*x[f.i]);
ans[P]+=delta*f.v;g[f.i]+=delta;lim-=delta;
if(g[f.i]<c[f.i])tmp.push((veg){a[f.i],f.i});
}
}
while(!tmp.empty()){
q.push(tmp.front());tmp.pop();
}
}
for(int i=;i<=n;i++){
if(g[i]==)p.push((veg){s[i]+a[i],i});
else if(g[i])p.push((veg){a[i],i});
tot+=g[i];
}
for(int i=P-;i>=;i--){
ans[i]=ans[i+];
if(tot<=m*i)continue;
ll lim=tot-m*i;
while(lim&&!p.empty()){
veg f=p.top();p.pop();
if(g[f.i]!=){
ll delta=min((ll)lim,g[f.i]-);
ans[i]-=delta*f.v;g[f.i]-=delta;lim-=delta;
if(g[f.i]==)p.push((veg){a[f.i]+s[f.i],f.i});
else p.push((veg){a[f.i],f.i});
}else{
lim--;g[f.i]--;ans[i]-=f.v;
}
}
tot=m*i;
}
for(int i=;i<=k;i++)printf("%lld\n",ans[read()]);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

辛酸史:最开始我在想如何建网络流,于是想到了BZOJ1061:[NOI2008]志愿者招募,毕竟是时间的路程那么坏掉水果就和他一样处理方法就行啦!于是期望可以40+分,注意答案会爆ll可能需要奇技淫巧。

于是因为错误的思路卡死在此无法动弹,不得已将灵魂出卖求助题解。

BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解的更多相关文章

  1. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  2. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  3. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  4. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  5. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

  6. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  7. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

  8. 洛谷p2370yyy2015c01的U盘题解

    没什么特殊的想法 就是看自己很久没有更新关于题解类的文章了而已 (其实这是我好久之前做的, 只是把它从洛谷博客搬到了这里而已) 题目 首先分析题目要二分 他长成这个亚子太二分了 所以就要二分 最好是先 ...

  9. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

随机推荐

  1. Qt官方开发环境生成的exe发布方式

    本来想自己写一个打包程序的文章了,但是我发现了宝贝,在这里,大神写的比我牛逼的多了,这里做一下搬运工 一是为了方便大家 二是为了以后方便自己找 原文链接:http://tieba.baidu.com/ ...

  2. ASP.NET中Gridview一些技巧

    ASP.NET中Gridview一些技巧 一.后台覆盖掉Gridview中自动填充的值 我们可以再Gridview中的事件触发的过程中修改其中的值,而这些值将会在具体的运行过程中覆盖掉那些自动属性.这 ...

  3. TW实习日记:第18天

    今天的bug没有那么多了,都是些小bug,一下就改好了.或者是接口那边数据返回的有问题,通知一下同事就ok了.主要今天是在赶功能进度,然而有一个功能模块需求里并没有写,实在是不知道要做成什么样子,真的 ...

  4. [Clr via C#读书笔记]Cp18 定制Attribute

    Cp18 定制Attribute 意义 利用Attribute,可以声明性的给自己的代码结构创建注解,从而实现一些特殊的功能:最终在元数据中生成,这种可扩展的元数据信息可以在运行时的时候查询,从而动态 ...

  5. 从零开始的Python学习Episode 1

    一.输入与输出 1.输入 input("number:") num = input("number:") 下面一段可以把输入的信息存在num中. 注意:输入的信 ...

  6. 洛谷 P1706 全排列问题 :STL / dfs

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...

  7. 【模板】DFS

    int dx[] = { 0,1,0,-1 }; int dy[] = { 1,0,-1,0 }; void dfs()//参数用来表示状态 { if (到达终点状态) { ...//根据题意来添加 ...

  8. 幸运的袋子(深度优先遍历(Depth First Search,DFS))

    题目描述 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的).如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积. 例如:如果袋子里面的球的号码是{1, 1, 2 ...

  9. 使用树莓派实现(山寨)高清视频叠加(HDMI OSD)

    项目需要在HDMI上叠加一些字符包括汉字和数值,要求不能使用台式机,本身也没有HDMI采集卡驱动开发能力,所以通过海思的HDMI编码器将HDMI编码为h.264网络视频流,然后通过树莓派解码显示,做字 ...

  10. 《安装ubuntu及VMware以及相关问题汇总》

    一.VMware Ubuntu安装详细过程 http://blog.csdn.net/u013142781/article/details/50529030 二.VMware Tools (ubunt ...