这题很有思维难度,乍一看基本无从下手。

给每个蔬菜钦定退役的时间显然很困难,可以考虑让时光倒流,从后向前递推,然后就变成了某个时间点有一部分蔬菜服役,而已经服役的蔬菜不会退役了。然后就可以直接考虑贪心,每种第一个出现的蔬菜,显然可以单独考虑,加上s[i],然后把蔬菜放到堆里面,就可以在O(pmlogn)的复杂度下求出f[p]了,用堆维护即可,假定p=1e5。

然后发现这个玩意可以递推求解,第p-1天在役的蔬菜一定不少于第p天的,显然只需去掉利润最少的m个即可。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e5+;
typedef long long ll;
typedef pair<int,int>pii;
struct node{int v,x;}st[N];
bool operator<(node a,node b){return a.v<b.v;}
int n,m,T,P=1e5,top,sum,a[N],s[N],c[N],x[N],used[N];
ll ans[N];
bool vis[N];
vector<int>d[N];
priority_queue<node>q;
int main()
{
scanf("%d%d%d",&n,&m,&T);
for(int i=;i<=n;i++)scanf("%d%d%d%d",&a[i],&s[i],&c[i],&x[i]);
for(int i=;i<=n;++i)if(!x[i])d[P].pb(i);else d[min(P,(c[i]+x[i]-)/x[i])].pb(i);
for(int i=P;i;i--)
{
for(int j=;j<d[i].size();j++)q.push((node){a[d[i][j]]+s[d[i][j]],d[i][j]});
if(q.empty())continue;
int j=m;
while(j&&!q.empty())
{
node u=q.top();q.pop();
if(!vis[u.x])
{
vis[u.x]=,ans[P]+=u.v,used[u.x]++,--j;
if(c[u.x]>)q.push((node){a[u.x],u.x});
}
else{
int rest=min(j,c[u.x]-used[u.x]-(i-)*x[u.x]);
ans[P]+=1ll*rest*u.v,used[u.x]+=rest,j-=rest;
if(used[u.x]!=c[u.x])st[++top]=(node){a[u.x],u.x};
}
}
while(top)q.push(st[top--]);
}
while(!q.empty())q.pop();
for(int i=;i<=n;i++)sum+=used[i];
for(int i=;i<=n;i++)
if(used[i]==)q.push((node){-s[i]-a[i],i});else if(used[i])q.push((node){-a[i],i});
for(int i=P-;i;i--)
{
ans[i]=ans[i+];
while(sum>i*m&&!q.empty())
{
node u=q.top();
q.pop(),u.v*=-;
if(used[u.x]>)
{
int rest=min(sum-i*m,used[u.x]-);
used[u.x]-=rest,sum-=rest,ans[i]-=1ll*rest*u.v;
if(used[u.x]==)q.push((node){-a[u.x]-s[u.x],u.x});
else q.push((node){-a[u.x],u.x});
}
else sum--,used[u.x]--,ans[i]-=u.v;
}
}
for(int i=,x;i<=T;i++)scanf("%d",&x),printf("%lld\n",ans[x]);
}

[NOI2017]蔬菜(贪心+递推)的更多相关文章

  1. CF822D 贪心+递推

    CF822D [题目链接]CF822D [题目类型]贪心+递推 &题意: 给你n个人,你可以把他们分组,但必须保持每组相等,分组之后每2个人会比赛,比如一组有i个人,那么就要比赛 次,f[i] ...

  2. 【51Nod】1519 拆方块 贪心+递推

    [题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法 ...

  3. codeforces 735C Tennis Championship(贪心+递推)

    Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...

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

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

  5. [NOI2017]蔬菜 贪心

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

  6. 2019 ICPC南京网络赛 F题 Greedy Sequence(贪心+递推)

    计蒜客题目链接:https://nanti.jisuanke.com/t/41303 题目:给你一个序列a,你可以从其中选取元素,构建n个串,每个串的长度为n,构造的si串要满足以下条件, 1. si ...

  7. NOI2017蔬菜(贪心)

    小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案. 在蔬菜仓库中,共存放有 n 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各 方面因素,设计合理的销售方案,以获得最多的收益. 在计算销售蔬菜的 ...

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

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

  9. [NOI2017]蔬菜——时光倒流+贪心

    题目链接 题解: 貌似一眼看过去是一个贪心. 其他的算法要记录的东西就太多了. 部分分其实很高.但是没有什么提示. 想一些套路:二分?不行还要贪心判断. 分治?前后取法是有影响的. 时光倒流? 也许可 ...

随机推荐

  1. H5易企秀

    周末被领导叫回来加班,说要做一个易企秀一样的页面,然后就有这篇笔记 原计划用几百个计时器去执行,后面放弃了,太难改了,还是选择了animate.css插件,这是一个纯css的插件,只需要引入css就行 ...

  2. Java 的 String.split 函数,消除空字符串

    代码: String str = "the music made it hard to concentrate"; String delims = "[ ]+" ...

  3. url中?的作用

    http://123.206.87.240:8002/get/?what=flag? 分隔实际的URL和参数 ,用于动态页面的交互和传参

  4. 基于Ambari的WebUI实现集群扩容案例

    基于Ambari的WebUI实现集群扩容案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.将HDP的服务托管给Ambari服务 1>.点击“Service Auto S ...

  5. CodeForces - 755C PolandBall and Forest (并查集)

    题意:给定n个数,Ai的下标为1~n.对于每一个i,Ai与i在同一个树上,且是与i最远的点中id最小的点(这个条件变相的说明i与Ai连通).求森林中树的个数. 分析:若i与Ai连通,则在同一个树上,因 ...

  6. 矿难已经过去,NVIDIA将高举光追大旗!

    在去年8月推出支持光线追踪技术的Turing图灵GPU之前,显卡市场差不多沉沦了两年,很大一个原因就是2017到2018年初的数字货币市场爆发,矿卡市场取代了游戏卡市场成为增长点,那一年多显卡厂商的日 ...

  7. jsp采用ajax传递数组给后台controller并遍历

    ajax传递数组,期间出各种各样的问题,那叫一个头疼,网上各种查,都没有解决,最终摸索摸索加借鉴搞定,不多说,上代码 /* 复选框选定部分 */ $("#delete").clic ...

  8. 111-PHP类变量之间的赋值标识为同一个对象

    <?php class mao{ //定义猫类 public $age=0; //定义多个属性并初始化 public $weight=50; public $color='white'; } $ ...

  9. Java基础(接口,list和ArrayLIst)

    1,使用接口的目的:不是10类都有getName()方法,则10个类都继承一个接口来实现.接口本身是一种规范,在具体业务有需求的时候才用接口. 具体例子: I充电设备 x = new 手机(" ...

  10. python基础(一)内置类型及方法

    python 内置类型主要包含7大类: 数字 序列 映射 文件 类 实例 异常 其中,最常用数据类型为序列 序列 python中包含7种内建序列 列表(list):由方括号构成,用逗号分隔项目: [a ...