\(\mathscr{Description}\)

  Link.

  有 \(n\) 块奶酪,每块奶酪出现时段为 \([s_i,t_i]\),体积为 \(V_i\);有 \(m\) 只老鼠要吃奶酪,第 \(i\) 只每秒吃 \(v_i\) 体积的奶酪。一块奶酪不能同时被多于一只老鼠吃,一只老鼠不能同时吃多于一块奶酪。求最小的 \(T\),使得所有 \(t_i\leftarrow t_i+T\) 后,老鼠可以把奶酪吃干净。

  多测,数组组数 \(K\le 5\),\(n,m\le30\),\(1\le v_i,V_i\le10^5\),所有给定数据为整数,注意老鼠不一定需要在整数时刻改变进食状态。

\(\mathscr{Solution}\)

  神妙网络流,给出了一个拆解“不能一对多”限制的建图模型。

  显然可以二分 \(T\),继而离散化出 \(\mathcal O(n)\) 个奶酪存在状态没有改变的时段。对于跨度为 \(\Delta t\) 的时段,老鼠 \(i\) 的进食量最多是 \(v_i\Delta t\),但问题是,如果直接在奶酪-老鼠的二分图上两两连边,完全无法刻画“一块奶酪不能同时被多于一只老鼠吃,一只老鼠不能同时吃多于一块奶酪”这一限制,这也是本题的难点。

  注意,网络流算法本身不可能去描述“只能一对一”,我们需要从建图修改,达到一种《奶酪“看上去”在被很多只老鼠吃,实际上等价于在被一只老鼠吃》的效果。怎么办?考虑差分。将老鼠按 \(v\) 升序排列,奶酪 \(i\) 连向老鼠 \(j\),容量为 \((v_j-v_{j-1})\Delta t\),表明我们可以把吃奶酪 \(i\) 的老鼠的速度从 \(v_{j-1}\) 提升到 \(v_j\),并保持一段时间,这段时间的长度作为流量,在网络流中将进行最优化抉择。另一方面,每一种“升级”的可用次数是不同的:从 \(v_{j-1}\) 升级到 \(v_j\) 的总时间自然不超过 \((m-j+1)\Delta t\)。从规范化的角度,如果一块奶酪选择了一些不连续的升级,考虑到可用升级时间的单降性,一定能够通过调整使之连续,使之能够对应到实际问题的方案上去,正确性就得以保证了。

  复杂度 \(\mathcal O(K\log V\operatorname{Dinic}(nm,n^2m))\)。

\(\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) const double EPS = 1e-7;
const int MAXN = 30, IINF = 0x3f3f3f3f;
int n, m, vol[MAXN + 5], st[MAXN + 5], ed[MAXN + 5], spd[MAXN + 5]; inline double dabs(const double x) { return x < 0 ? -x : x; }
inline int sign(const double x) { return dabs(x) <= EPS ? 0 : x < 0 ? -1 : 1; } namespace FG { const int MAXND = 2 * MAXN * MAXN + MAXN + 2;
const int MAXEG = MAXN + 2 * MAXN * MAXN + 2 * MAXN * MAXN * MAXN;
int S, T, B, ecnt = 1, head[MAXND + 5], dis[MAXND + 5], curh[MAXND + 5];
struct Edge { int to; double flw; int nxt; } graph[MAXEG * 2 + 5]; inline void clear() {
ecnt = 1;
rep (i, 0, B) head[i] = 0;
B = -1;
} inline void link(const int s, const int t, const double w) {
// printf("%d %d %d\n", s, t, w);
graph[++ecnt] = { t, w, head[s] }, head[s] = ecnt;
graph[++ecnt] = { s, 0, head[t] }, head[t] = ecnt;
} inline bool bfs() {
static int que[MAXND + 5], hd, tl;
rep (i, 0, B) dis[i] = IINF;
dis[que[hd = tl = 1] = S] = 0;
while (hd <= tl) {
int u = que[hd++];
for (int i = head[u], v; i; i = graph[i].nxt) {
if (sign(graph[i].flw) && dis[v = graph[i].to] > dis[u] + 1) {
dis[que[++tl] = v] = dis[u] + 1;
}
}
}
return dis[T] != IINF;
} inline double augment(const int u, double iflw) {
if (u == T) return iflw;
double ret = 0.;
for (int &i = curh[u], v; i; i = graph[i].nxt) {
if (sign(graph[i].flw) && dis[v = graph[i].to] == dis[u] + 1) {
double t = augment(v, std::min(iflw, graph[i].flw));
graph[i].flw -= t, graph[i ^ 1].flw += t, iflw -= t, ret += t;
if (!sign(iflw)) break;
}
}
if (!sign(ret)) dis[u] = IINF;
return ret;
} inline double dinic() {
double ret = 0;
while (bfs()) {
rep (i, 0, B) curh[i] = head[i];
ret += augment(S, IINF);
}
return ret;
} } // namespace FG. inline bool check(const double x) {
static double peri[MAXN * 2 + 5];
int pcnt = 0, req = 0;
rep (i, 1, n) peri[++pcnt] = st[i], peri[++pcnt] = ed[i] + x;
std::sort(peri + 1, peri + pcnt + 1); FG::clear(), FG::S = ++FG::B;
rep (i, 1, n) FG::link(FG::S, ++FG::B, vol[i]), req += vol[i];
FG::T = ++FG::B;
rep (i, 2, pcnt) if (sign(peri[i] - peri[i - 1])) {
double dur = peri[i] - peri[i - 1];
rep (j, 1, m) {
FG::link(++FG::B, FG::T, dur * spd[j] * (m - j + 1.));
rep (k, 1, n) {
if (sign(st[k] - peri[i - 1]) <= 0
&& sign(ed[k] + x - peri[i]) >= 0) {
FG::link(k, FG::B, dur * spd[j]);
}
}
}
}
return !sign(FG::dinic() - req);
} int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d %d", &n, &m);
rep (i, 1, n) scanf("%d %d %d", &vol[i], &st[i], &ed[i]);
rep (i, 1, m) scanf("%d", &spd[i]);
std::sort(spd + 1, spd + m + 1);
per (i, m, 1) spd[i] -= spd[i - 1]; double l = 0., r = 3e6;
while (l + EPS < r) {
double mid = 0.5 * (l + r);
if (check(mid)) r = mid;
else l = mid;
}
printf("%f\n", l);
}
return 0;
}

Solution -「ZJOI 2010」「洛谷 P2570」贪吃的老鼠的更多相关文章

  1. 洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$ 首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

随机推荐

  1. LeetCode题目练习记录 _数组和链表03 _20211011

    LeetCode题目练习记录 _数组和链表03 _20211011 206. 反转链表 难度简单2015收藏分享切换为英文接收动态反馈 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 ...

  2. 进程相互作用之信号量PV操作及其代码实现

    目录 信号量PV操作 基本介绍 数据结构 解决进程互斥问题 解决进程同步问题 代码实现(以同步问题为例) 信号量PV操作 基本介绍 信号量(Semaphore):是表示资源的实体,是一个与队列有关的整 ...

  3. Sublime装sftp远程编辑插件

    我平时很喜欢用Sublime来编辑一些脚本软件,本次需要远程编辑Linux上的脚本,需要安装一些插件来完成. Ctrl+Shift+P呼叫出命令行面板后输入 install选择 Install Pac ...

  4. delphi BDE Reader 不需要驱动

    用过Delphi开发的几乎都知道BDE,是读取paradox DB (*.db)数据库(表)读取的驱动. 要存取数据,必需安装 BDE驱动程序,才能正常读取,还需要配置,发布程序就更不方便,所以吐槽的 ...

  5. VTable-Gantt:功能强大、性能优异的开源甘特图组件

    甘特图的基本概念 在项目管理中,甘特图是一种常用的工具,用于展示项目任务的时间安排和进度. 我们将甘特图拆分成以下几个部分: 左侧任务列表:显示项目的任务列表,通常在图的左侧. 顶部时间轴:显示项目的 ...

  6. 无加密的机密性:Chaffing and Winnowing原理和C#实验仿真

    最近在Crypto 2023上看到一篇有趣的文章[1],其旨在一个存在拥有所有密钥并知道所有消息的"独裁者"的信道中,通过安排与常规密文无法区分的隐藏的"变形" ...

  7. apisix 转发 路由自动encode导致带中括号的文件下载404

    问题:apisix 转发 路由自动encode导致带中括号的文件下载404 原因:因为apisix 解码后tomcat处理会有问题,下载不了 解决方案:请求改写---协议,选择保持原样

  8. 2013年ImportNew最受欢迎的10篇文章

    2013年即将过去,提前祝大家元旦快乐,ImportNew 整理出了本年度最受欢迎的前10篇Java和Android技术文章,每篇文章仅添加了摘要.如果您是我们的新访客,那下面这些文章不能错过.如果您 ...

  9. 基于antlr的表达式解析器——函数生成(通过freemarker)

    第一步.新建一个模板文件以.ftl结尾. Max.ftl /* * Copyright 2002-2007 Robert Breidecker. * * Licensed under the Apac ...

  10. Python:pygame游戏编程之旅七(pygame基础知识讲解1)

    与Python自带的random.math.time等模块一样,Pygame框架也带有许多模块来提供绘图.播放声音.处理鼠标输入等功能. 本章将讲述Pygame提供的基本模块及功能,并假设读者已经具有 ...