省选训练赛 #18 题目 D 补题记录

news/2025/1/7 19:43:45/文章来源:https://www.cnblogs.com/Sktn0089/p/18658252

题意:有 \(n\) 棵待种的植物,关系呈一张 DAG,其中边 \((u, v)\) 表示必须等植物 \(u\) 成熟之后才能种下植物 \(v\),第 \(i\) 棵植物种下后需要花费 \(t_i\) 时间成熟。你有 \(m\) 点魔法,可以使用 \(d_i\) 点魔法令 \(t_i\) 减一,可以多次对一棵植物使用魔法,求最终种完所有植物的最早时间。

\(n, |E|\le 50,\ m,d_i\le 10^9,\ t_i \le 25\)

添加一个源植物 \(s\) 和一个汇植物 \(t\),前者需要种下后才能种其他植物,后者必须在所有植物种完后才能种下。设 \(x_i, y_i\) 表示植物 \(i\) 的种下时刻和成熟时刻,设 \(p_i\) 表示植物 \(i\) 的施法次数。二分答案 \(mid\),那么应该满足:

  • \(y_s + mid \ge x_t\)

  • \(x_i \le y_i\)

  • \(x_i + t_i - d_i \le y_i\)

  • \(x_v \ge y_u , \ \forall (u, v) \in E\)

不难发现这是最小费用循环流的对偶形式(详见此处):

  • \(0 - x_t + y_s \ge -mid\)

  • \(0 - x_i + y_i \ge 0\)

  • \(d_i - x_i + y_i \ge t_i\)

  • \(0 - y_u + x_v \ge 0, \ \forall (u, v) \in E\)

但是某些 \(d_{u, v}\) 必须取 \(0\),考虑答案式子 \(\sum_{(u, v) \in E} w_{u, v}d_{u, v}\) 中,令 \(w_{u, v} = + \infty\) 即可。

点击查看代码
#include <bits/stdc++.h>namespace Initial {#define ll long long#define ull unsigned long long#define fi first#define se second#define mkp make_pair#define pir pair <ll, ll>#define pb push_back#define i128 __int128using namespace std;const ll maxn = 1050, inf = 1e13, mod = 1e9 + 7, L = 1e7 + 10;ll power(ll a, ll b = mod - 2, ll p = mod) {ll s = 1;while(b) {if(b & 1) s = 1ll * s * a %p;a = 1ll * a * a %p, b >>= 1;} return s;}template <class T>const inline ll pls(const T x, const T y) { return x + y >= mod? x + y - mod : x + y; }template <class T>const inline void add(T &x, const T y) { x = x + y >= mod? x + y - mod : x + y; }template <class T>const inline void chkmax(T &x, const T y) { x = x < y? y : x; }template <class T>const inline void chkmin(T &x, const T y) { x = x > y? y : x; }
} using namespace Initial;namespace Read {char buf[1 << 22], *p1, *p2;// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 22) - 10, stdin), p1 == p2)? EOF : *p1++)template <class T>const inline void rd(T &x) {char ch; bool neg = 0;while(!isdigit(ch = getchar()))if(ch == '-') neg = 1;x = ch - '0';while(isdigit(ch = getchar()))x = (x << 1) + (x << 3) + ch - '0';if(neg) x = -x;}
} using Read::rd;ll n, t[maxn], c[maxn], a[maxn][maxn], m, deg[maxn], sum;
char str[maxn][maxn];struct Graph {ll n, s, t, head[maxn], tot, cur[maxn];struct edge {ll v, w, c, nxt;} e[maxn];void ins(ll u, ll v, ll w, ll c) {e[++tot] = (edge) {v, w, c, head[u]}, head[u] = tot;e[++tot] = (edge) {u, 0, -c, head[v]}, head[v] = tot;}bool vis[maxn]; ll dis[maxn]; queue <ll> q;bool spfa() {for(ll i = 1; i <= n; i++) dis[i] = inf;dis[s] = 0, q.push(s);while(!q.empty()) {ll u = q.front(); q.pop(), vis[u] = false;for(ll i = head[u]; i; i = e[i].nxt) {ll v = e[i].v, w = e[i].w, c = e[i].c;if(w && dis[v] > dis[u] + c) {dis[v] = dis[u] + c;if(!vis[v])vis[v] = true, q.push(v);}}} return dis[t] < inf;}ll dfs(ll u, ll flow) {if(u == t) return flow;ll used = 0; vis[u] = true;for(ll i = cur[u]; i; cur[u] = i = e[i].nxt) {ll v = e[i].v, w = e[i].w, c = e[i].c;if(!vis[v] && w && dis[v] == dis[u] + c) {ll tmp = dfs(v, min(w, flow - used));used += tmp, e[i].w -= tmp, e[i ^ 1].w += tmp;if(used == flow) break;}} vis[u] = false; return used;}pir dinic() {ll f = 0, c = 0;while(spfa()) {for(ll i = 1; i <= n; i++) cur[i] = head[i];f += dfs(s, inf);}for(ll i = 3; i <= tot; i += 2) c -= e[i].w * e[i].c;return mkp(f, c);}void clr() {for(ll i = 1; i <= n; i++) head[i] = 0;tot = 1, n = s = t = 0;}
} G;bool check(ll mid) {G.clr(), G.ins(2 * n + 3, n + 2, inf, mid); sum = 0;for(ll i = 1; i <= 2 * n + 4; i++) deg[i] = 0;for(ll i = 1; i <= n; i++) {G.ins(i + n + 2, i, inf, 0), G.ins(i, i + n + 2, c[i], t[i]);deg[i + n + 2] += c[i], deg[i] -= c[i];sum += c[i] * t[i];}for(ll i = 1; i <= n; i++)G.ins(i, 2 * n + 3, inf, 0), G.ins(n + 2, i + n + 2, inf, 0);for(ll u = 1; u <= n; u++)for(ll v = 1; v <= n; v++)if(a[u][v]) G.ins(v, u + n + 2, inf, 0);ll S = 2 * n + 5, T = S + 1, g = 0;G.n = G.t = T, G.s = S;for(ll i = 1; i <= 2 * n + 4; i++)if(deg[i] < 0) G.ins(S, i, -deg[i], 0), g -= deg[i];else if(deg[i] > 0) G.ins(i, T, deg[i], 0);pir res = G.dinic();return res.fi == g && sum - res.se <= m;
}int main() {rd(n);for(ll i = 1; i <= n; i++) {scanf("%s", str[i] + 1);for(ll j = 1; j <= n; j++)if(str[i][j] == '1') a[j][i] = 1;} rd(n);for(ll i = 1; i <= n; i++) rd(t[i]);rd(n);for(ll i = 1; i <= n; i++) rd(c[i]);rd(m);ll lo = 0, hi = 1250;while(lo <= hi) {ll mid = lo + hi >> 1;if(check(mid)) hi = mid - 1;else lo = mid + 1;} printf("%lld\n", lo);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pd虚拟机 [po] Parallels Desktop 20 激活 for Mac [jie] 安装教程【支持M芯片】

pd虚拟机 [po] Parallels Desktop 20 激活 for Mac [jie] 安装教程【支持M芯片】 Parallels Desktop 20 ,是一款Mac虚拟机软件,在搭载Apple M 系列芯片的任何 Mac 上运行 Windows,体验不同操作系统之间无缝集成。使用 Parallels Desktop 20 for Mac 体验 macOS 和 Windows 的…

【触想智能】什么是嵌入式工业一体机以及它的特点和应用领域分析

嵌入式工业一体机是一种集成了计算、控制、通信等功能的高度集成化设备。它在工业自动化领域中有着广泛的应用,为工厂生产、数据处理、监控和管理提供了全面的解决方案。下面是嵌入式工业一体机的定义、特点以及主要应用领域的具体介绍。一、嵌入式工业一体机的定义嵌入式工业…

VMware Fusion Pro 13 for Mac虚拟机软件

VMware Fusion Pro 13 for Mac虚拟机软件 VMware Fusion Pro for Mac,是一款mac虚拟机软件,跟Parallels Desktop一样,都可以让你的 Mac 同时运行一个或多个不同的操作系统。VMware Fusion Pro mac不仅能让你在Mac苹果电脑上运行Windows或Linux系统、使用非Mac平台的软件,而…

空压机网络接入实战:基于 MODBUS - TCP 转 Ethernet IP 网关的配置过程剖析

在工业自动化生产环境中,空压机作为重要的气源设备,其稳定运行和有效监控对于整个生产流程至关重要。然而,不同厂家生产的空压机可能采用不同的通信协议,这给集中监控和管理带来了挑战。在本次案例中,我们遇到的空压机采用 MODBUS - TCP 协议进行数据传输,但企业的自动化…

【CUMT】软件工程期末复习

1.软件工程概述1.2 计算机软件概述 1.4 软件生命周期 1.5 软件开发模型2.项目计划2.2 可行性研究3.需求分析3.2 数据流图DFD 3.3 数据字典DD 3.4 加工逻辑描述工具4.面向对象方法(OOA)4.2 统一建模语言UML 4.3 用例模型5.概要设计5.1 软件开发流程概念区分 5.2 软件结构设计 …

【vulnhub靶场】日志投毒与文件包含漏洞 Solstice

一、侦查1.1 收集目标网络信息:IP地址1.2 主动扫描:扫描IP地址段 二、初始访问2.1 利用面向公众的应用 三、权限提升3.1 利用漏洞提权:高权限运行的程序一、侦查 1.1 收集目标网络信息:IP地址 靶机启动后,没有提供IP地址。由于Kali和靶机在同一个C段,可以扫描ARP协议获取…

城市生命线安全管理:数据要素整合与场景应用实践

城市生命线工程是确保城市正常运行和居民安全生活的关键基础设施,涉及供水、排水、燃气、电力等多个方面。随着信息技术的发展,特别是大数据、物联网、人工智能等技术的应用,城市生命线数据要素与场景应用的深度融合成为提升城市治理能力的重要途径。数据要素的重要性城市生…

SqlSugar入门教程:连接,增、删、改、查

原文链接:https://blog.csdn.net/zls365365/article/details/131199132 第一步,自然是新建一个项目,控制台什么都可以。因为我还没想好怎么做一个完整的项目,那暂且用一个控制台举例吧。 下面自然是从NuGet安装sqlsugar了。注意鉴别需要安装的版本,我这里是安装sqlsugarc…

env(safe-area-inset-bottom) 兼容写法

先看下兼容性:可以看到 @supports 兼容性很好,所以使用 @supports 做兼容是个不错的选择。 例:@supports (padding-bottom: env(safe-area-inset-bottom)) or(padding-bottom: constant(safe-area-inset-bottom)) {.your-dom {padding-bottom: constant(safe-area-inset-bot…

工业采集系统-天然气计量仪表费用二次计算

1、在“驱动管理->中间件驱动”中添加NaturalGasCalculation.drive。2、在设备配置中,添加采集设备,假设采集到的天然气费用因子为D1.F1,充值金额因子为D1.F2,要求计算的天然气使用体积因子为D1.F3。3、在“系统功能->中间件”中添加一个天然气费用计算中间件,配置内…

SQL优化有绝招,使用DAS提升工作效率!完成任务可领取保暖手套!

​「使用DAS实现数据库SQL优化」活动上线了! 数据库自治服务(Database Autonomy Service,简称DAS)是一种基于机器学习和专家经验实现数据库自感知、自修复、自优化、自运维及自安全的云服务。数据库自治服务DAS支持自动SQL优化,相比传统的优化方式,能够自动识别问题SQL,…

类关系图

本文描述了面向对象设计中类与类之间的五种关系,并对这五种关系从耦合程度、语义和方向上进行了比较。类关系图