【题解】Codeforces 2062F Traveling Salescat

题目链接

Codeforces 2062F Traveling Salescat

题目大意

给定一张图含 \(N\) 个点,第 \(i\) 点有属性 \(a_i\)\(b_i\),任意两点间都有无向边,边权为 \(max(a_i + b_j, a_j + b_i)\) ,对于特定整数 \(k\) ,求一条恰经过 \(k\) 个不同点的路径上的边权和的最小值。

思路

看到 \(max\) 内部和多个点有关的任务,如果暴力处理求 \(max\) 肯定会多一个 \(N\) 的复杂度,第一想法就是想办法在 \(max\) 内部把 \(i\)\(j\) 分离开来。

基于这个思路,很容易想到如下公式:

\[w_{ij} = max(a_i + b_j, a_j + b_i) = max(a_i - b_i, a_j - b_j) + b_i + b_j \]

其中 \(w_{ij}\)\(i\)\(j\) 间的边权。

此时很显然的,如果我先把 \(N\) 个点按照 \(a_i - b_i\) 排序,我就可以保证:

\[w_{ij} = \begin{cases} a_j + b_i, i<j\\ a_i + b_j, j<i \end{cases} \]

不妨真的这么排序,然后记这条路径为 \(v_s, v_1, v_2 ... v_k-2, v_t\), 其中 \(v_s\)\(v_t\) 分别是路径起终点,此时我们可以分类讨论:

  1. 考虑 \(v_1, v_2 ... v_k-3, v_k-2\) 构成的边,也就是中间一般点间的边,为保证整条路径的边权最小,这类节点按照排序后的顺序从小到大(或从大到小,为行文方便这里以从小到大举例)访问可以得到最优解,这一部分对于答案的贡献为:

\[\Sigma_{i=2}^{k-2} \ w_{v_{i-1},v_i} = \Sigma_{i=2}^{k-2} \ b_{v_{i-1}} + a_{v_i} = \Sigma_{i=1}^{k-2} \ a_{v_i} + b_{v_i} - a_{v_1} - b_{v_{k-2}} \]

  1. 考虑 \(v_s, v_1\) ,若 \(v_s < v_1\) ,那么对答案的贡献为 \(b_{v_s} + a_{v_1}\) ;否则,对答案的贡献为 \(b_{v_1} + a_{v_s}\),这会导致 \(v_1\) 对于答案的贡献为 \(2b_{v_1}\)

  2. 考虑 \(v_{k-2}, v_t\) ,若 \(v_{k-2} < v_t\) ,那么对答案的贡献为 \(b_{v_{k-2}} + a_{v_t}\) ;否则,对答案的贡献为 \(b_{v_t} + a_{v_{k-2}}\),这会导致 \(v_{k-2}\) 对于答案的贡献为 \(2a_{v_{k-2}}\)

现在,对于一条路径我们已经有了求解办法,然而枚举所有路径是不现实的,如何高效求解最小的边权和?

很显然动态规划,对于这类问题有一种朴素的构造方法,我们可以枚举点 \(i \ in [1, n]\),表示考虑前 \(i\) 个点,记 \(dp_k\) 为此时路径包含 k 个点时的最优解,但是我们发现,一般点状态好转移,涉及起终点的状态不好转移,故我们可以加一个维度,重新构造。

枚举点 \(i \in [1, n]\),表示考虑前 \(i\) 个点,记 \(dp_{k,t}\) 为此时路径包含 k 个点时的最优解,其中

  • \(t=0\) 既没考虑起点也没考虑终点
  • \(t=1\) 考虑起点没考虑终点
  • \(t=2\) 考虑起点,考虑终点

此外理论还有一种状态既考虑终点没考虑起点的状态,但是显然考虑起终点的顺序不影响答案,故可以省略,然后编码就很轻松了,记得像背包一样,一个点一轮只能更新 \(dp\) 一次,故我用 \(tdp\) 暂存更新,整轮更新完成再覆盖。

AC代码

#include <iostream>
#include <algorithm>
using namespace std;const int N = 3005;
const long long INF = 0x3f3f3f3f3f3f3f3f;
class City{
public:long long a, b;bool operator<(const City &o) const {return a-b<o.a-o.b;}
};City city[N];long long ans[N];long long dp[N][3];
long long tdp[N][3];int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T;cin>>T;while(T--) {int n;cin>>n;for(int i=1;i<=n;i++) {cin>>city[i].a>>city[i].b;ans[i] = INF;for(int j=0;j<3;j++) {tdp[i][j] = INF;}}sort(city+1, city+1+n);for(int i=1;i<=n;i++) {for(int j=0;j<=n;j++) {for(int k=0;k<3;k++) {dp[j][k] = tdp[j][k];}}tdp[1][0] = min(tdp[1][0], city[i].b*2); // vs > v1 时,v1的贡献tdp[1][1] = min(tdp[1][1], city[i].b); // vs < v1 时,vs的贡献for(int j=1;j<=n;j++) {for(int k=0;k<3;k++) {tdp[j+1][k] = min(tdp[j+1][k], dp[j][k] + city[i].a + city[i].b); // 一般点的贡献}tdp[j+1][1] = min(tdp[j+1][1], dp[j][0] + city[i].a); // vs > v1 时,vs的贡献tdp[j+1][2] = min(tdp[j+1][2], dp[j][1] + city[i].b); // vt < v_k-2 时,v_t的贡献ans[j+1] = min(ans[j+1], dp[j][1] + city[i].a); // vt > v_k-2 时,vt的贡献ans[j+1] = min(ans[j+1], dp[j][2] + city[i].a*2); // vt < v_k-2 时,v_k-2的贡献}}for(int i=2;i<=n;i++) {cout<<ans[i]<<" ";}cout<<endl;}
}

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

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

相关文章

又是一年叶落时(九)

前序: 又是一年叶落时 2017.10.20 又是一年叶落时(二) 2018.10.13 又是一年叶落时(三) 2019.10.19 又是一年叶落时(四) 2020.10.25 又是一年叶落时(五) 2021.11.22虽然隔了4年,但终归又回到了这里。在某种程…

revit api 编程实现窗口缩放视图

revit api 编程实现窗口缩放视图UIView.GetWindowRectangle:获取绘图区的范围,坐标值是屏幕坐标 UIView.GetZoomCorners() : 获取绘图区的范围,坐标是模型坐标系 根据上缅的两个数据可以计算出模型坐标与屏幕坐标…

从大厂到中小公司,活下去的五个生存法则

从大厂到中小公司,活下去的五个生存法则降预期,调心态,活下去四年前,我从北京回到西安,离开大厂转战中型公司。这几年,我见过很多大厂人想回家,从一线跳到新一线、二线。有些慢慢习惯也就呆下来了,有些很不适应…

Tauri2-Vite7Admin客户端管理后台|tauri2.9+vue3+element-plus后台系统

最新研发tauri2.9+vite7.1+pinia3桌面版高颜值中后台系统TauriVue3Admin。 vite7-tauri2-admin最新跨平台技术tauri2.9+vite7.1.12+vue3 setup+pinia3+element-plus+echarts搭建电脑端轻量级管理后台系统模板。提供4种…

[Chrome] [插件] 插件推荐

[Chrome] [插件] 插件推荐$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");创建时间:2025年11月1日00:24:02 更新时间:2025年11月1日00:24:09目录01 翻译1.…

餐饮不仅仅卖食物,更卖的是服务。

餐饮业本质上属于服务业——这或许是我们最常听到,也最值得深思的一句话。顾客来到餐厅,当然希望品尝美味的食物,但他们的需求远不止于此。一顿满意的用餐体验,是味觉享受与心理满足的双重叠加。而后者,往往来自于…

山石防火墙NAT-NAT64

山石防火墙NAT64测试。测试环境如下: 转换前: 3001::1 -> 2011::1 转换后: 21.1.1.1 -> 30.1.1.1Cilent配置 # interface Vlan-interface10 ip address 20.1.1.2 255.255.255.0 # interface LoopBac…

10月31日日记

1.今天学习java 2.明天休息 3.B树和B+树在数据库索引中怎么应用?

【RabbitMQ】RPC模式(请求/回复)

本章目标理解RabbitMQ RPC模式的工作原理和适用场景。掌握回调队列(Callback Queue)和关联ID(Correlation Id)的使用。实现基于RabbitMQ的异步RPC调用。学习RPC模式下的错误处理和超时机制。构建完整的微服务间同步…

圆锥曲线的离心率1

Problem 已知双曲线 $ E: \frac{ x^2 }{ a^2 } - \frac{ y^2 }{ b^2 }=1 \hspace{0.1cm} (a>0 , b>0)$ 的左、右焦点分别为 $ F_1,F_2 $ , 过右焦点作平行于其中一条渐近线的直线交双曲线于点 $ A $ ,若三角形…

由逃逸分析决定 --是什么意思?

Go 中“由逃逸分析决定”的意思核心概念:逃逸分析是编译器在编译期判断一个变量是否会“逃出”其作用域(函数栈帧)的过程。不逃逸 → 可以分配在栈上,函数返回时自动回收,效率更高。 发生逃逸 → 必须分配在堆上,…

[笔记]CSP-S 2025 第二轮 Final Review

仍在更新中。 Hope everything ok. 依照 NOI 大纲 2025 进行整理,删掉了一些考不到的内容。 数据结构 STL deque(双端队列) deque<int> q; q.size(); q.empty(); q.clear(); q.front(),q.back(); q.emplace_b…

文件多、杂乱,想分类也可以、不想分类也能快速找到文档的解决方案

多数人的常态:我的电脑桌面和云盘里堆满了各种文件夹,命名也比较随意。是的,我们是无法将文件管理得井井有条,至少时间一长,文件一多,就会“乱”。我们要承认和适应自己的这种特点。所以 文档大师 使用的“先收集…

浏览器单击事件绑定空方法为什么能执行

背景 标题就是我之前产生的疑惑。 排查 F12打开开发者工具,选择页面中的那个单击元素。找到事件侦听器 -> click 一般最下面这个就是我们的元素。之所以感到困惑,是因为这个按钮元素绑定的方法是个空函数,但是确…

阅读笔记三:以“工匠精神”打磨职业内核 - 20243867孙堃2405

《程序员的修炼之路:从小工到专家》让我深刻体会到,“修炼”二字,无关天赋,无关捷径,而是以工匠精神坚守职业初心,在日复一日的沉淀中打磨职业内核。书中对“专家素养”的定义,没有停留在技术能力的层面,更强调…

如何看懂explain工具信息,使用explain工具来分析索引

EXPLAIN 工具能用于获取查询执行计划,即分析 MySQL 如何执行一个 SQL 语句。我们可以通过使用EXPLAIN 去模拟优化器执行 SQL 语句,从而分析 SQL 语句有没有使用索引、是否采用全表扫描方式、判断能否更进一步优化等。…

BLE-HCI浅学

低功耗蓝牙协议栈学习之HCI自我阐述这几天的学习来看,蓝牙协议栈核心在于“协议栈”,就是很多协议像栈一样层层递进。而本文主要阐述HCI层。 本文主要简单的总结,什么是HCI、HCI流控、HCI的协议格式。 最后举一个BL…

阅读笔记二:跳出技术陷阱,构建全局视野 - 20243867孙堃2405

读完《程序员的修炼之路:从小工到专家》,我彻底打破了“技术好就能成为专家”的固有认知。书中清晰地指出,程序员的进阶之路,本质是从“单一技术执行者”到“全局解决方案提供者”的蜕变,而这一过程的核心,是跳出…

1067:整数的个数

提交数:127712 通过数: 88967 【题目描述】 给定k(1<k<100)个正整数,其中每个数都是大于等于1,小于等于10的数。写程序计算给定的k个正整数中,1,5和10出现的次数。 【输入】 输入有两行:第一行包含一个正…