建议不要写本题解的垃圾做法
[省选联考 2020 A 卷] 树
似乎是场切的第一道紫题?
成功拿下最长解+最劣解
子树类问题,考虑每个点对它祖先的贡献。异或问题,考虑拆位处理。
考虑一个点什么时候会有贡献:
以权值为 10101
的第三位为例:10101->11000->11100->100000->100100->101000
可以发现,除了开始的部分,后边它的贡献区间(在深度轴上)是周期变化的。
容易用取模去刻画这个周期:用树状数组维护深度模 1<<1,1<<2,1<<3...
这些 2 的幂次意义下的修改操作,需要区间加,单点查询。
然而还有一个问题:最开始那一段是不符合这个周期的,因此需要找到这一段区间中会被错误加上1的部分,然后给它捡回去。由于最开始那一段长度不足一个周期,因此不会影响复杂度。
这个找多余贡献的部分我没有想到比较简单的处理方法(因为一个区间在模意义下可能拆成两个),因此我写了很蠢的四个区间求交。这一部分就占了4kb。
直接在做 dfs 的时候进行这个过程,利用「DFS 子树前和 DFS 完子树后权值的差」得到子树的贡献。就做完了。跑的似乎比3个log和1个log都要慢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!