【学习笔记】树分治
点分治
普通的分治在一段子段
点分治是一种把分治思想运用到树上解决问题的算法(但是其实更多人愿意称其为数据结构?)。它一般适用于与路径有关的问题。
考虑我们现在处理的是子树
注意我们处理的是这个重心的答案,于是我们要减去来自同一子树的贡献。具体的做法有很多种。你可以把 加贡献和处理答案分开做,对于一个子树先把它的答案统计完再加入其贡献。这种写法常数略大。
你也可以 记录一个点属于哪个子树然后离线下来做,在本身就需要离线处理贡献的题目里面很好用。
如果记录一个节点属于哪个子树但是不好维护其在那个子树中的贡献也可以把答案统计完后 用类似容斥的做法 把来自同一个子树的贡献减去。
点分树
尝试把每层找到的重心和上一层的重心连边形成一棵点分树。
有一些优秀的性质。
首先树高是
然后所有节点的子树大小和是
然后点分树上
所以如果我们的答案只要知道路径上任意一个点而不是硬性要求 lca,就可以暴力跳点分树求解。单论点分树复杂度一次是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具