[NOI2017]蔬菜(贪心)
神仙题啊!
早上开了两个多小时,终于肝出来了,真香
我们考虑从第 \(10^5\) 天开始递推,先生成 \(p=10^5\) 的解,然后逐步推出 \(p-1,...,2,1\) 的解。
那怎么推出 \(p=10^5\) 的解呢?
现在将题目转化成不停进货然后取 \(m\) 个最大的问题,然后删除最大并 \(push\) 进去。这我们可以想到大根堆。
但是由于政策 增加题目难度,有一个 \(s\)。我们需要先将 \((a_i+s_i,i)\) \(push\) 进去,然后用掉了以后将 \((a_i,i)\) \(push\) 进去。
因为在第 \(i\) 天买了一种蔬菜,当天就无需再用,我们考虑用一个栈存储一下当天用了不是 \(a+s\) 的蔬菜,
然后 \(p=10^5\) 的解生成完了以后,现在就是生成其他解了。
我们每次将最小的 \(sum-i*m\) 个取出然后删除。此时我们也要特判政策。
答案要开 \(long\ long\),时间复杂度 \(O(pm\log n)\)
\(Code\ Below:\)
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define F first
#define S second
using namespace std;
const int maxn=100000+10;
const int lim=100000;
int n,m,k,a[maxn],s[maxn],c[maxn],x[maxn],used[maxn],sum,top;
vector<int> v[maxn];ll ans[maxn];pii sta[maxn];
priority_queue<pii> pq;
inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
int main()
{
n=read(),m=read(),k=read();
for(int i=1;i<=n;i++){
a[i]=read(),s[i]=read(),c[i]=read(),x[i]=read();
if(x[i]==0) v[lim].push_back(i);
else v[(c[i]+x[i]-1)/x[i]].push_back(i);
}
pii u;int rest;
for(int i=lim;i>=1;i--){
for(int j=0;j<v[i].size();j++) pq.push(mp(a[v[i][j]]+s[v[i][j]],v[i][j]));
for(int j=m;j>=1&&!pq.empty();){
u=pq.top(),pq.pop();
if(!used[u.S]){
used[u.S]++;ans[lim]+=u.F;j--;
if(used[u.S]!=c[u.S]) pq.push(mp(a[u.S],u.S));
}
else {
rest=min(j,c[u.S]-used[u.S]-(i-1)*x[u.S]);
ans[lim]+=(ll)rest*a[u.S];used[u.S]+=rest;j-=rest;
if(used[u.S]!=c[u.S]) sta[++top]=mp(a[u.S],u.S);
}
}
while(top) pq.push(sta[top--]);
}
while(!pq.empty()) pq.pop();
for(int i=1;i<=n;i++) sum+=used[i];
for(int i=1;i<=n;i++){
if(used[i]==1) pq.push(mp(-a[i]-s[i],i));
else if(used[i]) pq.push(mp(-a[i],i));
}
for(int i=lim-1;i>=1;i--){
ans[i]=ans[i+1];
while(sum>i*m&&!pq.empty()){
u=pq.top(),pq.pop();u.F=-u.F;
if(used[u.S]==1) ans[i]-=u.F,sum--,used[u.S]=0;
else {
rest=min(sum-i*m,used[u.S]-1);
sum-=rest;used[u.S]-=rest;ans[i]-=(ll)rest*a[u.S];
if(used[u.S]==1) pq.push(mp(-a[u.S]-s[u.S],u.S));
else pq.push(mp(-a[u.S],u.S));
}
}
}
while(k--) printf("%lld\n",ans[read()]);
return 0;
}
[NOI2017]蔬菜(贪心)的更多相关文章
- [NOI2017]蔬菜 贪心
题面: [NOI2017]蔬菜 题解: 首先每天蔬菜会变质这点并不好处理,我们考虑让时间倒流,从后向前处理,这样的话就相当于每天都会得到一定量的蔬菜. 这样做有什么好处呢? 我们可以发现一个性质:如果 ...
- NOI2017蔬菜(贪心)
小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案. 在蔬菜仓库中,共存放有 n 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各 方面因素,设计合理的销售方案,以获得最多的收益. 在计算销售蔬菜的 ...
- BZOJ.4946.[NOI2017]蔬菜(贪心 离线)
题目链接 因为有删除,考虑倒序处理某个p的询问. 那么每天删除xi的蔬菜就变成了每天运来xi的蔬菜.那么我们取当前最优的即可,早取晚取都一样,不需要留给后面取,还能给后面更优的留出空间. 这样就只需考 ...
- 【BZOJ4946】[NOI2017]蔬菜(贪心)
[BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...
- bzoj4946: [Noi2017]蔬菜 神烦贪心
题目链接 bzoj4946: [Noi2017]蔬菜 题解 挺神的贪心 把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚 按价格排序后,贪心的往前面可以填的位置填就可以了.找可 ...
- [NOI2017]蔬菜
[NOI2017]蔬菜 题目描述 大意就是有\(n\)种物品,第\(i\)个物品有\(c_i\)个,单价是\(a_i\).然后每天你可以卖出最多\(m\)个物品.每天结束后第\(i\)种物品会减少\( ...
- BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...
- 4946: [Noi2017]蔬菜
4946: [Noi2017]蔬菜 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 分析: 贪心. 首先可以将一个蔬菜拆成两个,一个是有加成 ...
- BZOJ4946 NOI2017蔬菜(贪心+堆)
容易想到一个费用流做法:将每种蔬菜拆成p种,对应p个过期时间,每一种向可以卖的时间连边,第一次卖的奖励算在最晚过期的一种里.对于天数动态加点.不过这样边数太多了,因为第i天能卖的第i-1天一定能卖,可 ...
- uoj318 [NOI2017]蔬菜 【贪心 + 堆 + 并查集】
题目链接 uoj 题解 以前看别人博客,在考场上用费用流做,一直以为这题是毒瘤网络流题 没想到竟然是贪心模拟题... 如果只有一个蔬菜呢?这就是一个经典的普及难度的贪心,正着推面临优先选择的困难,而逆 ...
随机推荐
- 【密码学】轻松理解“加盐”的原理与java实现
转自:https://blog.csdn.net/DavidHuang2017/article/details/80283469 一.什么是加盐? 1.背景 现在很多公司后台以hash值形式存储用户密 ...
- ansible的playbook剧本
一.playbook剧本介绍 1)playbook介绍 Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansibl ...
- AOP 环绕通知 (Schema-base方式) 和 AspectJ方式在通知中获取切点的参数
环绕通知(Schema- base方式) 1.把前置通知和后置通知都写到一个通知中,组成了环绕通知 2.实现步骤: 2.1 新建一个类实现 MethodInterceptor 接口 public cl ...
- 2018.11.07 NOIP模拟 异或(数位dp)
传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码
- Cannot read property 'protocol' of undefined的原因和解决办法
Cannot read property 'protocol' of undefined 原因:axios请求中的错误 1.请求地址写错了 2.没有引入http.js 3.引入http.js的时候,单 ...
- 作用域的一些说明,static关键词
作用域的一些说明 变量分为全局变量和局部变量.学过C语言的童鞋都知道,全局变量的作用域是整个整个文件.在即使在函数内部也有效,但在php中,如果在函数中使用全局变量,php会认为这个变量没有定义.如果 ...
- idea在相应的包下右键创建servlet,找不到servlet选项
开始pom.xml文件里面我是只引进了个servlet包,但是右键依旧没有servlet选项 <dependency> <groupId>javax.servlet</g ...
- Windows 下 Quartus 检测不到 USB-Blaster 终极解决办法
转自https://blog.csdn.net/acang301/article/details/50471067?locationNum=12 一.Windows无法正常驱动USB-Blaster ...
- ArcGIS的地理坐标系与大地坐标系
一直以来,总有很多朋友针对地理坐标系.大地坐标系这两个概念吃不透.近日,在网上看到一篇文章介绍它们,非常喜欢.所以在此转发一下,希望能够对制图的朋友们有所帮助. 地理坐标:为球面坐标. 参考平面地是 ...
- ★ prototype、__proto__ 详解
# var Person = function(name) { this.name = name; } var p = new Person(); //new操作符的操作是 var p = {} p. ...