\(\mathscr{Description}\)

  Link.

  原题意比较简洁了。注意一下卖出的菜也会变质,且让它们代替未卖出的菜变质是更优的。

\(\mathscr{Solution}\)

  一眼网络流,尝试建图。在原题意上建图的话我得到了一个五层结点的图……于是可以以逆向时间描述问题。不难得到模型:

  • \(S\) 连向 \((i,t)\),容量为菜 \(i\) 在 \(t\) 时刻变质的数量,费用为 \(a_i\);若 \(t\) 时刻后 \(i\) 全部变质,则分出一单位流量增加 \(s_i\) 的费用。
  • \((i,t)\) 连向 \((i,t-1)\),容量为 \(+\infty\),费用为 \(0\);
  • \((i,t)\) 连向 \(T_t\),容量为 \(+\infty\),费用为 \(0\);
  • \(T_t\) 连向 \(T\),容量为 \(m\),费用为 \(0\)。

  对于单个询问,该图的最大费用任意流(其实必然是最大流)费用就是答案。直接来貌似可以获得比较可观的分数。

  接下来,我们手动分析流网络,通过比较模式化的分析找到结论。

  考虑按(正向)时间顺序加入 \(T_t\) 及其连边的过程,从增广的角度思考答案的更新:

  图中 IV 的增广环不如仅走右侧蓝色路径的反向路径优秀;V 的增广环显然不是负环。因此,\(S\) 无法在残余网络上推流。回归到原问题,得到结论:当 \(t_1>t_2\),\(t_2\) 所选择的蔬菜集合是 \(t_1\) 的子集。如果我们求出 \(t_\max\),贪心地去掉最便宜的菜就能得到其他时刻的答案。

  求 \(t_\max\) 的答案?类似地分析可以发现,随着时间(逆向)向前,每种蔬菜的选取数量都会越来越多。因而可以维护现有蔬菜的堆,以及可能因为 \(S\) 的流量进入“复活”的蔬菜集合。模拟 \(T_t\) 从大到小向 \(T\) 增广的过程即可。

  复杂度 \(\mathcal O(nm\log n)\)。

\(\mathscr{Code}\)

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) typedef long long LL;
typedef std::pair<int, int> PII;
#define fi first
#define se second template <typename Tp>
inline void chkmin(Tp& u, const Tp& v) { v < u && (u = v, 0); }
template <typename Tp>
inline void chkmax(Tp& u, const Tp& v) { u < v && (u = v, 0); }
template <typename Tp>
inline Tp imin(const Tp& u, const Tp& v) { return u < v ? u : v; }
template <typename Tp>
inline Tp imax(const Tp& u, const Tp& v) { return u < v ? v : u; } const int MAXN = 1e5, MAXM = 10;
int n, m, k, a[MAXN + 5], s[MAXN + 5], c[MAXN + 5], x[MAXN + 5], p[MAXN + 5];
int sold[MAXN + 5], wait[MAXN + 5];
LL ans[MAXN * MAXM + 5];
std::vector<int> imp[MAXN + 5]; int main() {
scanf("%d %d %d", &n, &m, &k);
rep (i, 1, n) scanf("%d %d %d %d", &a[i], &s[i], &c[i], &x[i]);
rep (i, 1, k) scanf("%d", &p[i]); int mxt = *std::max_element(p + 1, p + k + 1);
rep (i, 1, n) {
if (!x[i]) imp[mxt].push_back(i);
else imp[imin(mxt, (c[i] + x[i] - 1) / x[i])].push_back(i);
} std::priority_queue<PII> heap;
per (i, mxt, 1) {
for (int j: imp[i]) wait[++wait[0]] = j;
rep (i, 1, wait[0]) {
heap.emplace(sold[wait[i]] ? a[wait[i]]
: a[wait[i]] + s[wait[i]], wait[i]);
}
wait[0] = 0;
for (int rst = m; rst-- && !heap.empty();) {
int u = heap.top().se;
++sold[u], heap.pop();
if (c[u] - (i - 1) * x[u] > sold[u]) heap.emplace(a[u], u);
else if (x[u]) wait[++wait[0]] = u;
}
} rep (i, 1, n) if (sold[i]) {
ans[++ans[0]] = a[i] + s[i];
while (--sold[i]) ans[++ans[0]] = a[i];
}
std::sort(ans + 1, ans + ans[0] + 1);
std::reverse(ans + 1, ans + ans[0] + 1);
rep (i, 2, ans[0]) ans[i] += ans[i - 1];
int all = ans[0]; ans[0] = 0;
rep (i, 1, k) printf("%lld\n", ans[imin(all, p[i] * m)]);
return 0;
}

Solution -「NOI 2017」「洛谷 P3826」蔬菜的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  3. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  4. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  5. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  6. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  7. 「洛谷 P1801」黑匣子

    好像很久没有更过博客了,因为博主这几周很忙.其实是在搞颓. 题意很难懂,所以就不重复了.其实是懒. 一眼看上去这是个 \(Splay\) 裸题,直接插入一个数,查询区间第 \(K\) 大,但是这样太不 ...

  8. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  9. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  10. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

随机推荐

  1. numpy的一些基本操作

    文章目录 1.numpy数组的多种创建方式 1.1使用np.array()创建 1.2使用plt创建 1.3使用np的routine函数创建 2.numpy的常用属性 2.1shape 2.2ndim ...

  2. C#使用Socket实现分布式事件总线,不依赖第三方MQ

    使用 Socket 实现的分布式事件总线,支持 CQRS,不依赖第三方 MQ. CodeWF.EventBus.Socket 是一个轻量级的.基于 Socket 的分布式事件总线系统,旨在简化分布式架 ...

  3. SSIS作业提示所请求的 OLE DB 访问接口 Microsoft.ACE.OLEDB.12.0 尚未注册

    没有跨不过的坎,也没有解决不了的问题,那些曾经没有把我们打死的困难,最终都会让我们变得更加强大 最近在使用ETL获取Excel数据时,在本地运行没有任何问题,部署到服务器后,使用作业运行时便一直提示以 ...

  4. Docker和k8s核心概念(理解友好版)

    背景 这是在HWL负责网校云业务线测试时,给同事分享的基础概念文档. 目录: 一. Docker核心概念 二. Kubernetes是什么及架构 三. Kubernetes核心概念 四. Deploy ...

  5. 0基础读顶会论文—流程即服务(PraaS):通过无服务器流程统一弹性云和有状态云

    Abstract 细粒度的无服务器函数为许多新应用提供了动力,这些应用受益于弹性扩展和按需付费计费模型,同时将基础设施管理开销降至最低.为了实现这些特性,函数即服务(FaaS)平台将计算和状态分离,P ...

  6. 网站安全,为什么老外如此钟爱国产 WAF?

    大家好,我是长亭雷池 WAF 社区的开发者,这段时间一直在忙着搞雷池国际版,前后搞了两三个月,总算初步有了一些收获,写个帖子和大家分享一下. 雷池 WAF 社区版 雷池 WAF 社区版是由长亭科技打造 ...

  7. P11233 CSP-S 2024 染色

    P11233 CSP-S 2024 染色 考试最后码方程忘记 \(a[i-1]\) 了,调不出来,只好 \(50pts\) 收尾. 思路 \(dp\) 的难点在于确定一段的颜色后,无法快速找到上一段相 ...

  8. P4119 Ynoi2018 未来日记

    P4119 Ynoi2018 未来日记 lxl 出的题好 duliu 啊. 感谢来自 fr200110217102 的博客 题解 P4119 [Ynoi2018未来日记]. 下标分块+值域分块+并查集 ...

  9. 纯HTML5+CSS3实现一棵自己跳舞的树

    代码没有多少,也没有用到任何图片,就实现了一棵可以自己跳舞的树.文件组成就简简单单的一个html和一个css html部分并不是很复杂,就是一些空的div,然后加上html模板也就那么十来行代码 最关 ...

  10. Tensorflow 使用TPU训练

    要用TPU训练tensorflow模型,只能使用静态图.也就是要先通过keras的sequential或者函数式定义模型,而不能直接使用重写的Model类.例子如下,其中包含层的自定义,以及子像素卷积 ...