当前位置: 首页 > news >正文

APC001F

APC001F

给定一棵树,边有边权 \(a_i\),每次可以操做一条路径,使得这条路径上每条边的边权异或上某个 \(x\),问至少需要操作几次才能使所有 \(a_i\) 变成 \(0\)

\(n \le 10^5, a_i \le 15\)

对于这种路径异或问题(其他的可能也适用),有一个经典套路:令 \(b_u\) 表示 \(u\) 连接的边的边权异或和,那么一条 \(u - v\) 的路径操作姓党相当于 \(b_u \oplus = x, b_v \oplus = x\)

那么相当于现在有 \(n\) 个数,每次可以让两个数同时异或 \(x\),要使所有数都变成 \(0\) 的最少方案数。

凭借直觉,若 \(b_i = b_j\),肯定直接消掉就行了(花一次操作消掉两个数)。所以剩下的数最多出现一次(总共只有至多 \(16\) 个数。)

对于一个异或和为 \(0\) 的集合 \(S\),可以通过 \(|S| - 1\) 次操作把集合内的元素消成 \(0\),于是只需要最大化拆分的集合数量即可。

剩下的就可以状压了,令 \(dp(x)\) 表示现在还有哪些数没消掉,枚举一个异或和为 \(0\) 的子集消掉即可。

时间复杂度:\(O(3^{16} + n)\)

优化

其实这个转移是可以优化的。

不难发现,每次转移到的状态的异或和都是 \(0\)。于是我们可以一个一个的消,如果 \(x\) 对应的异或和为 \(0\),就给 \(dp(x) + 1\),表示需要耗费一次操作。

for (int x = (1 << n) - 1; x; x--) {dp[x] = INF;int s = 0;for (int u = 0; u < 16; u++) {if ((x >> u) & 1) {s ^= u;dp[x] = min(dp[x], dp[x ^ (1 << u)]);}}dp[x] += (s == 0);
}

时间复杂度:\(O(162^{16} + n)\)

http://www.rkmt.cn/news/89018.html

相关文章:

  • 云服务器的核心优势
  • 爬youtube视频笔记
  • [JOI Open 2016] 摩天大楼
  • 家乐事净水器加盟费多少?0加盟费+装修补贴+区域保护,全程扶持解读 - 资讯焦点
  • zz深入了解LlamaIndex实现Agent代码和原理
  • linux: gdb调试器
  • 6 个最佳开源 AI 仪表盘工具
  • ①【openFuyao】智算时代的异构算力连接器
  • 毕业设计实战:基于SSM+MySQL的图书商城管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
  • #题解#洛谷P1120 小木棍#搜索#剪枝
  • 毕业设计实战:基于Java+MySQL的校园二手书交易平台设计与实现,从需求到上线全流程避坑指南!
  • 实时图形工具包GLG Toolkit:工业领域HMI数据可视化的优选产品
  • 使用Junit测试
  • 人类文明可通过技术手段(如加强航天器防护、改进电网设计)缓解地球两极反转带来的影响
  • 智能客服
  • ComfyUI由浅入深全方位,AI生图,AI生成视频,AI动画教程
  • 决策树模型实战指南:避免过拟合、欠拟合与无关特征
  • YashanDB数据库的读写分离策略分析
  • 2025年最后一个月,公司需要注意什么?
  • 可信数据空间:驱动社会高质量发展的“数字基石”,必要性无可替代
  • 自动驾驶汽车与利益相关者互动的功能安全与网络安全分析高效的方法
  • HarmonyOS 5 极致动效实验室:给 UI 注入“物理动效”
  • springboot基于vue的比亚迪新能源汽车销售系统的设计与实现_1061pdmq
  • springboot基于vue的拜泉县房屋拆迁安置信息管理系统设计与实现_yt2m39o4
  • springboot基于vue的故宫博物馆文创网店商城系统的设计与实现_oj61901i
  • 什么是UUID,怎么组成的?
  • YashanDB数据库的多活架构设计及实施要点.
  • Simple Form性能优化完整指南:5个实用技巧让Rails表单快如闪电
  • Vue Flow与Pinia状态管理实战指南:构建高效可视化应用
  • YashanDB数据库的多活架构设计与实施经验分享