原文链接 www.cnblogs.com/zhouzhendong/p/UOJ318.html

前言

我怎么越来越菜了。

题解

首先,对于一个物品,我们将它拆成若干份:最后一天拆成两份,一份的个数为1 ,价值为 a+s;另一份的个数为 (c-1) mod x,价值为 a。对于在 $(c-1) / x $ 天以及以前,每天有一份个数为 x,价值为 a 的物品。

于是,用堆维护物品,每次取最大价值的,就可以在 \(O(n ^ 2 m \log n)\) 的时间复杂度内得到一个询问的答案。

考虑将所有物品分成两种:

  1. 这种物品个数为 x,价值为 v 。
  2. 这种物品个数为 x,价值为 v,而且每天又会凭空多出 x 个。

然后同样用堆维护,可以做到 \(O(n m\log n)\) 回答单次询问。

如果我们得到了 \(k\) 天的答案,那么我们只需要扔掉价值最小的一些物品,使得剩余物品数 \(\leq (k-1) m\) ,就可以得到 \(k-1\) 天的答案。

于是我们只需要算出 100000 天的答案,然后倒推,即可预处理出所有询问的答案。

总时间复杂度 \(O(nm\log n+ k)\)。

代码

#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof x)
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define Fod(i,b,a) for (int i=(b);i>=(a);i--)
#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define outval(x) cerr<<#x" = "<<x<<endl
#define outtag(x) cerr<<"---------------"#x"---------------"<<endl
#define outarr(a,L,R) cerr<<#a"["<<L<<".."<<R<<"] = ";\
For(_x,L,R)cerr<<a[_x]<<" ";cerr<<endl;
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=100005;
int n,m,k;
int lim=1e5;
struct Node{
int type,T;
LL x;
int v,X;
Node(){}
Node(int _t,int _x,int _v){
type=_t,x=X=_x,v=_v;
}
friend bool operator < (Node a,Node b){
return a.v<b.v;
}
};
vector <Node> A[N];
priority_queue <int,vector <int>,greater <int> > Q;
priority_queue <Node> q;
vector <Node> tmp;
LL res[N];
int main(){
n=read(),m=read(),k=read();
For(i,1,lim)
A[i].clear();
For(i,1,n){
int a=read(),s=read(),c=read(),x=read();
if (!c)
continue;
if (x>0){
int las=c/x+1,rem=c%x;
if (rem==0)
las--,rem=x;
las=min(las,lim-1);
A[las].pb(Node(0,1,a+s));
A[las].pb(Node(0,rem-1,a));
A[las-1].pb(Node(1,x,a));
}
else {
A[lim].pb(Node(0,1,a+s));
A[lim].pb(Node(0,c-1,a));
}
}
LL ans=0;
Fod(i,lim,1){
for (auto v : A[i]){
Node vv=v;
vv.T=i;
q.push(vv);
}
tmp.clear();
For(cc,1,m){
if (q.empty())
break;
Node now=q.top();
q.pop();
if (now.T>i&&now.type==1)
now.x+=(LL)(now.T-i)*now.X,now.T=i;
if (now.x==0){
if (now.type==1)
tmp.pb(now);
cc--;
continue;
}
ans+=now.v;
Q.push(now.v);
now.x--;
q.push(now);
}
while (!tmp.empty())
q.push(tmp.back()),tmp.pop_back();
}
Fod(i,lim,1){
res[i]=ans;
while (Q.size()>m*(i-1)){
ans-=Q.top();
Q.pop();
}
}
while (k--)
printf("%lld\n",res[read()]);
return 0;
}

UOJ#318. 【NOI2017】蔬菜 贪心的更多相关文章

  1. [NOI2017]蔬菜 贪心

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

  2. NOI2017蔬菜(贪心)

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

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

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

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

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

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

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

  6. [NOI2017]蔬菜

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

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

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

  8. 4946: [Noi2017]蔬菜

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

  9. uoj318 [NOI2017]蔬菜 【贪心 + 堆 + 并查集】

    题目链接 uoj 题解 以前看别人博客,在考场上用费用流做,一直以为这题是毒瘤网络流题 没想到竟然是贪心模拟题... 如果只有一个蔬菜呢?这就是一个经典的普及难度的贪心,正着推面临优先选择的困难,而逆 ...

随机推荐

  1. C#通用公共类库ZXNetStandardDepot.Common

    总结了一下写项目中遇到的各种方法,总结前辈们的经验,生成了该类库,引用net standard类库,支持net core/net framework. 使用方法 1.nuget 搜索 ZXNetSta ...

  2. 3)创建,测试,发布 第一个NET CORE程序

    工具:Visual Studio Code 或者 Visual Studio 环境:.NET CORE 2.0 VS Code很强大 当然支持netcore的开发,但是我还是选择更熟悉更强大的VS. ...

  3. 空间数据索引RTree(R树)完全解析及Java实现

    第一部分 空间数据的背景介绍 空间数据的建模 基于实体的模型(基于对象)Entity-based models (or object based) 常用的空间数据查询方式 空间数据获取的方法 R树 简 ...

  4. hybris backoffice创建product遇到的synchronization问题和解答

    我从product DSC-H20_MD clone了一个新的product,code为DSC-H20_MD1 因为它的状态有个红灯: 所以我点了这个sync按钮: 结果报这个错: 之后这个clone ...

  5. 纯JavaScript实现的调用设备摄像头并拍照的功能

    这篇文章本来不在Jerry计划内的,咱们SAP中国研究院今天已经正式上班了,Jerry也回到工作岗位开始搬砖了. 今天一位同事问我关于本文标题描述的功能如何实现,Jerry在网上随便搜了一下,类似的例 ...

  6. CentOS7.5 部署Ceph luminous

    环境 两台CentOS7.5,每台各两块硬盘部署OSD public network = 10.0.0.0/24 cluster network = 172.16.0.0/24 导入ceph的rpm ...

  7. JavaWeb开发回顾总结【不断更新中】

    1.Java语言编程 2.Servlet & JSP(JavaServer Pages) JSPGet方法中文乱码,以上是我的一篇解决Get方法的文章. 关于编码的约定,从项目的一开始就要规定 ...

  8. Windows 下的常规命令(收藏)

    1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. l ...

  9. 使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇

    使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用Cloudera Manager搭建zo ...

  10. HTML&CSS基础-边框简写属性

    HTML&CSS基础-边框简写属性 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> ...