[NOI2017]蔬菜(贪心+递推)
这题很有思维难度,乍一看基本无从下手。
给每个蔬菜钦定退役的时间显然很困难,可以考虑让时光倒流,从后向前递推,然后就变成了某个时间点有一部分蔬菜服役,而已经服役的蔬菜不会退役了。然后就可以直接考虑贪心,每种第一个出现的蔬菜,显然可以单独考虑,加上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]蔬菜(贪心+递推)的更多相关文章
- CF822D 贪心+递推
CF822D [题目链接]CF822D [题目类型]贪心+递推 &题意: 给你n个人,你可以把他们分组,但必须保持每组相等,分组之后每2个人会比赛,比如一组有i个人,那么就要比赛 次,f[i] ...
- 【51Nod】1519 拆方块 贪心+递推
[题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法 ...
- codeforces 735C Tennis Championship(贪心+递推)
Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...
- BZOJ.4946.[NOI2017]蔬菜(贪心 离线)
题目链接 因为有删除,考虑倒序处理某个p的询问. 那么每天删除xi的蔬菜就变成了每天运来xi的蔬菜.那么我们取当前最优的即可,早取晚取都一样,不需要留给后面取,还能给后面更优的留出空间. 这样就只需考 ...
- [NOI2017]蔬菜 贪心
题面: [NOI2017]蔬菜 题解: 首先每天蔬菜会变质这点并不好处理,我们考虑让时间倒流,从后向前处理,这样的话就相当于每天都会得到一定量的蔬菜. 这样做有什么好处呢? 我们可以发现一个性质:如果 ...
- 2019 ICPC南京网络赛 F题 Greedy Sequence(贪心+递推)
计蒜客题目链接:https://nanti.jisuanke.com/t/41303 题目:给你一个序列a,你可以从其中选取元素,构建n个串,每个串的长度为n,构造的si串要满足以下条件, 1. si ...
- NOI2017蔬菜(贪心)
小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案. 在蔬菜仓库中,共存放有 n 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各 方面因素,设计合理的销售方案,以获得最多的收益. 在计算销售蔬菜的 ...
- 【BZOJ4946】[NOI2017]蔬菜(贪心)
[BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...
- [NOI2017]蔬菜——时光倒流+贪心
题目链接 题解: 貌似一眼看过去是一个贪心. 其他的算法要记录的东西就太多了. 部分分其实很高.但是没有什么提示. 想一些套路:二分?不行还要贪心判断. 分治?前后取法是有影响的. 时光倒流? 也许可 ...
随机推荐
- Linux 只复制目录,不复制目录下数据文件
[root@yoon u02]# mkdir yoon [root@yoon u02]# mkdir hank [root@yoon yoon]# mkdir -p 1/data [root@yoon ...
- R语言 scale()函数
1.scale() 函数 #Usage scale(x, center = TRUE, scale = TRUE) #center中心化,scale标准化 #Arguments x :a numeri ...
- 配置 git公钥报错:unknown key type -rsa
配置 git公钥的时候出现:ssh-keygen unknown key type -rsa 一个解决办法是去本地寻找.ssh文件,参考路径(C:\Users\Administrator.ssh),把 ...
- 小米百元NFC智能神器来了:必成爆款!
6月14日,小米手环4全渠道首卖,其中电商平台今日10:00开卖,线下小米之家需要顾客持本人身份证限购一台. 首销结束后,米家官微宣布,小米手环4下一轮开售时间在6月18日上午10:00,届时小米手环 ...
- 编写程序,实现在带头结点的单链表L中删除一个最小值节点的算法。
算法复杂度0(n) #!/usr/bin/env python3 class LNode(object): def __init__(self, elem, next_=None): self.ele ...
- tomcat端口号被占用,且杀进程不能够杀掉解决办法
在电脑上安装了zookeeper以后,配置好tomcat启动发现端口号8009端口号被占用,报错如下: 采用netstat –ano 查询所有进程查看或者根据端口号查进程netstat -ano |f ...
- CSS - 美化字体 => CSS的-font-smoothin属性优化
body{ margin: 0; font-family: Arial, Helvetica, sans-serif; line-height: 1.2em; back ...
- Spring Boot2(003):简要回顾“HelloWorld” web 工程
1.注解: @RestController 和 @RequestMapping HelloWorldExample 中的第1个注解 @RestController 是一个被熟知的原型注解(stereo ...
- ADLS_pppoe 基本设置过程
ADLS_pppoe 设置: ①:开启接口的PPPoe功能——pppoe enable ②:指明接口是拨号池1的成员——pppo-client dial-pool-number ③:创建一个逻辑上的拨 ...
- 015-PHP读取TXT记事本内容
<?php print("<H3>通过http协议打开文件</H3>\n"); // 通过 http 协议打开文件 if (!($myFile = f ...