P14309 【MX-S8-T2】配对题解

news/2025/10/27 19:26:55/文章来源:https://www.cnblogs.com/WinterXorSnow/p/19169929

题目链接

题目大意

给定\(n\)个点的树,每条边有边权,每个点有一个参数\(c_i\),若\(c_i =1\),表示被用于配对,每个点只能配对一次,若能配对,则必须配对。每一次配对,会给\(r\)加上两个点之间的距离。可以交换一次\(c_i\),求\(r\)的最小值。

数据范围:\(2 \leq n \leq 10^6\)\(1 \leq w_i \leq 10^9\)\(c_i \in \{0, 1\}\)\(1 \leq u_i, v_i \leq n\)

解题思路

由于本篇题解是参照第一篇题解,因此同样钦定\(c\)为0的点为白点,否则为黑点

关键观察

通过手玩样例,我们可以意识到如果不进行交换,则在最优方案下,两个配对的黑点之间一定不会有其他未配对的黑点

再通过一定的思考,我们就可以得出,在最优方案下,每一棵子树内最多只剩下一个还未被匹配的黑点。进一步的,我们可以发现,一条边如果能产生贡献,当且仅当这个子树内有奇数个黑点。那么,答案仅与每个子树黑点个数的奇偶性相关

至此,我们有了更高效的计算方式

状态设计

考虑各个操作对答案的影响:

删除

从这个节点到根路径上的所有节点取反

交换

考虑交换\(i,j\),那么就是从\(i\)\(j\)路径上的所有点取反。其中,特别的,两点的LCA不变

接下来是第一篇题解的精妙之处:其设计了\(f_{i,x,y}\),表示\(i\)节点,取反\(x\)个黑点和\(y\)个白点的最小贡献

通过这种方式,使得官方题解中的八个近乎猎奇的状态变成了类似与背包的状态,更加易于思考,转移

状态转移

有了上面的状态,转移并不算难

我们可以枚举自身和儿子的状态进行转移

钦定当前考虑转移的状态为:\(f_{u,a_u,b_u}\)\(f_{v,a_v,b_b}\),那么转移就显然为\(f_{u,a_u+a_v,b_u+b_v}=f_{u,a_u,b_u} + f_{v,a_v,b_b} + w \times (size_v+b_u+b_v) mod 2\),在这里,\(size_i\)表示\(i\)为根的子树内的黑点总数

初始状态:\(f_{i,0,0}=0\),当前点为黑点,则有\(f_{i,1,0} =0\),否则有\(f_{i,0,1}=0\)

注意:由于这个DP非常像背包,因此需要用\(g\)来辅助转移,否则会出现前面的转移影响后面的情况

具体实现看代码

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define FailureG(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define pii pair<int,int>
#define fi first
#define se second
namespace WinterXorSnow{const int N = 1e6 + 10;vector< pair < ll , ll > > G[N];ll f[N][3][2],g[N][3][2];int n;ll siz[N],c[N];void dfs(int u,int fa){siz[u] = c[u];for(auto [v,w] : G[u]){if(v == fa) continue;dfs(v,u);siz[u] += siz[v];}return ;}void solve(int u,int fa){f[u][0][0] = 0;if(c[u]) f[u][1][0] = 0;else f[u][0][1] = 0;for(auto [v,w] : G[u]){memset(g[u],0x3f,sizeof g[u]);if(v == fa) continue;solve(v,u);for(int a1 = 0;a1 <= 2;a1 ++){for(int b1 = 0;b1 <= 1;b1 ++ ){for(int a2 = 0;a2 <= 2;a2 ++ ){for(int b2 = 0;b2 <= 1;b2 ++ ) {int x,y;x = a1 + a2;y = b1 + b2;if(x > 2 || y > 1) continue;g[u][x][y] = min(g[u][x][y],f[v][a2][b2] + f[u][a1][b1] + w * ((siz[v] - a2 + b2 + 2) % 2));}}}}memcpy(f[u],g[u],sizeof g[u]);}return ;}void work(){cin >> n;for(int i=1;i<=n;i++)cin  >> c[i];for(int i=1;i<n;i++){ll u,v,w; cin >> u >> v >> w;G[u].push_back({v,w});G[v].push_back({u,w});}dfs(1,0);memset(f,0x3f,sizeof f);solve(1,0);if(siz[1] & 1) cout << min(f[1][1][0],f[1][2][1]);else cout << min(f[1][0][0],f[1][1][1]);}
}
int main()
{IOS;WinterXorSnow::work();return 0;
}

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

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

相关文章

魔改sunpinyin

魔改sunpinyinapt source libsunpinyin3v5 到当前目录下。 src/sunpinyin-dictgen是个有shebang的Makefile:#!/usr/bin/make -f W3M = wget -q -O - DL_LIST = https://sourceforge.net/projects/open-gram/files/ DL_…

20232308 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1 实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程 (2)通过组合应…

「WC2014-紫荆花之恋」题解

题解记录P3920 [WC2014] 紫荆花之恋 sol 首先如果不带修的话就是点分治板子,带修的话就是动态点分树板子。 由于写过一篇动态点分树的博客,这里就对动态点分树部分不详细讲解了,主要讲一下信息维护吧。不会的话可以…

2025.10.27C 城堡考古 题解

有同学让我造福人类,所以来写一篇。考虑显然没有什么通项公式可以利用的,但是注意到 \(m\) 仅仅只有小小的 \(6\),考虑状压 \(dp\) 的思路。设 \(dp_{i,j}\) 表示当前已经排了 \(i\) 列,状态为 \(j\) 的方案数,其…

【密码学实战】openHiTLS PKCS12命令行程序: PKCS12文件生成与解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[xp] GVim v9.0.494 (or thereabouts) is the last version known to support Windows XP.

下载地址:https://github.com/vim/vim-win32-installer/releases/tag/v9.0.0494If you need the last version of GVim (the GUI build of Vim) that officially supports Windows XP, here’s what I found — and s…

线段树;区间求和优化

线段树;区间求和优化线段树构造: 线段树:4*空间 第一种: #define maxn 100007//元素个数 int SegTree[maxn << 2];//线段树 // int lazy[maxn << 2];//延迟更新 int A[maxn];//原是数组第二种:结构体…

实用指南:2.CSS3.(2).html

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

「CTSC2017-游戏」题解

题解记录P3772 [CTSC2017] 游戏 sol 首先,由期望的线性性,把贡献拆到单点上,对每一场计算其胜利的概率即可。 首先已知的局可以不管,未知的局,显然只与其两侧最近的已知局有关。后面运用的一些概率表达在题面最下…

谢谢你周医生

谢谢你 周敏,张景     南京很美,想起你们我的心也很温暖

想让默认头像不再千篇一律,就顺手复刻了一下 GitHub 的思路

探索如何让默认头像不再千篇一律,我用 Go 复刻了 GitHub 风格的头像生成逻辑,根据输入生成独一无二的方块头像。文章分享了实现原理、效果展示以及未来扩展的思路在各种平台上,初始注册的用户通常都会被分配一个默认…

来源未知

点击查看代码 from PIL import Image# 定义字符集合 ascii_char = list("$@B%8&W#*oahkbdpqwmZO0QLCJYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`. ")def get_char(r, g, b, alpha=256):if a…

10.27(补)

继承和多态的动手动脑整理的word补上 链接:[https://files.cnblogs.com/files/blogs/847692/20243732张博学课后作业4.zip?t=1761562926&download=true]

vue3 vue3-form-element表单生成工具 输入框增加后缀

JSON schema数据{"title": "测试注册表单","description": "A simple form example.","type": "object","properties": {"firstName&quo…

java(3)基础规范

Java对大小写敏感。 关键字class的意思是类。JAVA是面向对象的语言,所有代码必须位于类里面。 编译后的源文件,得到相应的字节码文件,编译器为每个类生成独立的字节码文件。 main方法是JAVA应用程序的入口方法。格式…

袁天罡称骨歌的评骨格歌诀 - 木易

二两一钱:男:此命非业谓大凶,平生灾难事叠重,凶祸频临陷逆境,终世困苦事不成。女:生身此命运不通,乌云盖月黑朦胧,莫向故园载花木,可来幽地种青松。二两二:男:此命推来真气人,身寒骨冷若伶仃,劳劳碌碌虚度…

stm32F411RETx系列无CAN的处理思路

CAN 考虑到STM32F411RETX系列根本没有CAN,这该怎么办呢? 我在网上搜索到了一个解决方法: 使用一个独立的 CAN控制器芯片(如 MCP2515,这是最常用的选择),通过 SPI接口与 STM32通信。STM32 作为主机,通过 SPI协议…

Date 10.27

在 Print 之前 到现在还是想不明白为什么不骗那显眼的 80pts。 赛时 420/500pts,T5放了道紫。 A - 玩数字P.S. \(n \le 10^{15}\) 唐题,可以 \(O(\sqrt n)\) 解决,中间进行数位分离即可,当然你也可以打表。 Code #…

20232402 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1 基础免杀技术测试​ (1)msfvenom 编码器免杀: 生成未编码与多次编码的反向连接恶意程序,分别复制到靶机,对比杀软拦截情况,验证编码器对特征码的混淆效果;​ (2)Veil 工具免杀: 通过 Veil 生…

读书日记3

6到10章深入探讨了编程中最基础的元素——变量和数据类型,让我看到了平凡中的非凡。 核心收获与深刻见解: 1.变量命名的艺术性:McConnell详细阐述了优秀变量名的特征——表达"什么"而不是"如何"…