题目链接

bzoj4946: [Noi2017]蔬菜

题解

挺神的贪心

把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚

按价格排序后,贪心的往前面可以填的位置填就可以了。找可以填的位置用并查集维护一下。这样就求出了最大天数的答案。

对于询问的答案,从最后一天往前推,把最便宜的那些丢掉就好了。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define gc getchar
#define pc putchar
#define int long long
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') c = gc();
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc();
return x * f;
}
void print(int x) {
if(x < 0) {
pc('-'); x = -x;
}
if(x >= 10)print(x / 10);
pc(x % 10 + '0');
}
const int maxn = 200007;
int n,m,k;
struct node {
int a,d,c,x;
node(int a = 0,int c = 0,int x = 0,int d = 0) : a(a), c(c),x(x),d(d) {};
bool operator < (const node &k) const {
return a > k.a;
}
} a[maxn];
int tot = 0;
int q[maxn],fa[maxn];
int find(int x ) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
void unionn(int x,int y) {
int fx = find(x),fy = find(y);
if(fx == fy) return ;
fa[fy] = fx;
}
int cnt = 0;
int g[maxn],d[maxn],ga[maxn];
int sum = 0;
void calc(int idx,int c,int a) {
sum += 1ll * c * a;
g[cnt] += c;ga[cnt] = a;
d[idx] += c;
if(d[idx] == m) unionn(idx - 1,idx);
}
int L[maxn],upd[maxn];
int ans[maxn];
main() {
//freopen("1.in","r",stdin);
n = read(),m = read(),k = read();
for(int aa,s,c,x,i = 1;i <= n;++ i) {
aa = read(),s = read(),c = read(),x = read();
a[++ tot] = node(aa + s,1,0,x ? (c - 1) / x + 1 : maxn - 7);
if(-- c) a[++ tot] = node(aa,c,x,x ? (c - 1) / x + 1 : maxn - 7);
}
int maxd = 0;
for(int i = 1;i <= k;++ i) maxd = std::max(maxd,q[i] = read());
std::sort(a + 1,a + tot + 1);
for(int i = 1;i <= maxd;++ i) fa[i] = i;
for(int i = 1;i <= tot;++ i) {
cnt ++;
int idx = find(std::min(a[i].d,maxd)); //a 价值 d GG日期 d 数量 x 每天GG数
int res = (idx - 1) * a[i].x ,now = a[i].c - res;
while(idx && now) {
int mn = std::min(m - d[idx],now);
calc(idx,mn,a[i].a);
now -= mn;
int p = idx;
idx = find(idx - 1);
p -= idx;
if(res) now += p * a[i].x , res -= p * a[i].x;
}
if(!find(maxd)) break ;
}
int R = 0;
for(int i = 1;i <= maxd;++ i) L[i] = m - d[i] + L[i - 1];
for(int i = maxd;i;-- i) upd[i] = std::max(R - L[i],0ll),R += d[i];
for(int i = maxd;i >= 1;-- i) {
ans[i] = sum;
int tmp = upd[i - 1] - upd[i];
while(tmp) {
int mn = std::min(tmp,g[cnt]);
sum -= 1ll * ga[cnt] * mn;
tmp -= mn;
g[cnt] -= mn;
if(!g[cnt]) -- cnt;
}
}
for(int i = 1;i <= k;++ i) print(ans[q[i]]),pc('\n');// print(10);
return 0;
} // 1110001

bzoj4946: [Noi2017]蔬菜 神烦贪心的更多相关文章

  1. BZOJ4946 NOI2017蔬菜(贪心+堆)

    容易想到一个费用流做法:将每种蔬菜拆成p种,对应p个过期时间,每一种向可以卖的时间连边,第一次卖的奖励算在最晚过期的一种里.对于天数动态加点.不过这样边数太多了,因为第i天能卖的第i-1天一定能卖,可 ...

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

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

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

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

  4. bzoj4946 Noi2017 蔬菜

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

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

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

  6. [NOI2017]蔬菜(贪心+递推)

    这题很有思维难度,乍一看基本无从下手. 给每个蔬菜钦定退役的时间显然很困难,可以考虑让时光倒流,从后向前递推,然后就变成了某个时间点有一部分蔬菜服役,而已经服役的蔬菜不会退役了.然后就可以直接考虑贪心 ...

  7. [NOI2017]蔬菜(贪心)

    神仙题啊! 早上开了两个多小时,终于肝出来了,真香 我们考虑从第 \(10^5\) 天开始递推,先生成 \(p=10^5\) 的解,然后逐步推出 \(p-1,...,2,1\) 的解. 那怎么推出 \ ...

  8. [NOI2017]蔬菜 贪心

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

  9. [NOI2017]蔬菜

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

随机推荐

  1. STM32 变量无法赋值问题

    STM32 在用JLink 调试的时候发现有一条将unsigned char赋值给int的语句始终不能执行,int类型变量的值始终为0: 查资料找到这个问题是编译器优化的原因,也就是说由于编译器优化, ...

  2. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Synchronization and semapores

    1.前言 本文主要介绍原子变量的实现原理,对原子变量的修改有一套特殊的机制 2. Local monitor和Global monitor UP时执行Load EX和Store EX时仅需关注Loca ...

  3. sysbench安装、对Mysql压力测试、结果解读及mysql数据库跟踪优化

    sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. sysbench支持以下几种测试模式: 1.CPU运算性能 2.磁盘IO性能 3.调度程序性 ...

  4. dynamic web module和对应的TOMCAT 版本

    大致因为java的web系统有多种类型,比如静态的和动态的,然后动态的java web project要设置dynamic web module,也就是动态网页模型,他必须要和对应的服务器搭配好了才能 ...

  5. 取消Eclipse控制台显示行数的限制

    --------------------------------------------------------------------------------------------------- ...

  6. pytest五:fixture_autouse=True

    平常写自动化用例会写一些前置的 fixture 操作,用例需要用到就直接传该函数的参数名称就行了.当用例很多的时候,每次都传返个参数,会比较麻烦.fixture 里面有个参数 autouse,默讣是 ...

  7. jquery追加元素的不同语法

    问题 项目中越来越多的地方需要实现无刷新来更新页面局部内容,使用ajax从后台获取数据然后追加到页面中.那么怎么获取数据之后如何实现元素的追加呢? 解决 jQuery提供追加元素函数,掌握常用的四种追 ...

  8. Ext.Js核心函数( 三)

    ExtJs 核心函数简介 1.ExtJs提供的常用函数2.get.fly.getCmp.getDom.getBody.getDoc3.query函数和select函数4.encode函数和decode ...

  9. 【C++ Primer | 15】C++虚函数表剖析②

    多重继承 下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系. 注意:子类只overwrite了父类的f()函数,而还有一个是自己的函数(我们这样做的目的是为了用g1()作为一个标记 ...

  10. hdu 1711( 模式串T在主串S中首次出现的位置)

    Sample Input213 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 1 313 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 2 1 Sample Out ...