当前位置: 首页 > 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.jsqmd.com/news/78990/

相关文章:

  • #题解#洛谷P1120 小木棍#搜索#剪枝
  • 云服务器的核心优势
  • 2025安全婴儿面霜测评:华西珐玛领衔,敏宝护理指南 - 资讯焦点
  • PyCausalSim:基于模拟的因果发现的Python框架
  • 爬youtube视频笔记
  • 使用vscode运行python,解释器为anaconda的虚拟环境,使用pip命令安装库失败解决方案
  • 某游戏大厂的常用面试问题解析:Netty 与 NIO - 指南
  • 软件工程学习日志2025.12.12
  • 云端算力:数字时代的核心引擎与创新基石
  • 家乐事净水器加盟费多少?0加盟费+装修补贴+区域保护,全程扶持解读 - 资讯焦点
  • 病毒学研究的关键工具:重组病毒蛋白的技术解析与应用实践
  • zz深入了解LlamaIndex实现Agent代码和原理
  • 搜维尔科技:Xsens独立项目-面向独立工作室的高端动作捕捉
  • 2025年度活动板房厂家TOP5实力评测:资质口碑场景适配全维度选型指南 - 资讯焦点
  • 解码智能指针
  • 毕业设计实战:基于SSM+MySQL的药店管理系统设计与实现,从需求到测试轻松通关!
  • linux: gdb调试器
  • 6 个最佳开源 AI 仪表盘工具
  • 红队日记 --- W1R3S
  • 深夜炸场!GPT-5.2发布;Meta被曝用阿里千问优化新模型;马斯克点赞腾讯游戏业务:他们的品味非常好 | 极客头条
  • 毕业设计实战:基于SSM+MySQL的图书商城管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
  • springboot基于vue的承德市养老院智慧健康检测系统_ 用药提醒 一键呼叫 1f16uvca
  • Kate 高级文本编辑器 v26.03.70 官方中文版
  • 毕业设计实战:基于Java+MySQL的校园二手书交易平台设计与实现,从需求到上线全流程避坑指南!
  • java <T> 是什么?
  • Python 面向对象核心概念梳理
  • 毕业设计实战:SpringBoot教学资料管理系统,从0到1完整开发指南
  • RPM构建依赖仓库变更管理策略:从混乱到可控
  • 边缘计算机设备管理系统搭建全流程技术攻略
  • 美颜SDK算法工程师实践笔记:滤镜与特效模块的可维护性设计