建议不要写本题解的垃圾做法

[省选联考 2020 A 卷] 树

似乎是场切的第一道紫题?

成功拿下最长解+最劣解

子树类问题,考虑每个点对它祖先的贡献。异或问题,考虑拆位处理。

考虑一个点什么时候会有贡献:

以权值为 10101 的第三位为例:10101->11000->11100->100000->100100->101000 可以发现,除了开始的部分,后边它的贡献区间(在深度轴上)是周期变化的。

容易用取模去刻画这个周期:用树状数组维护深度模 1<<1,1<<2,1<<3... 这些 2 的幂次意义下的修改操作,需要区间加,单点查询。

然而还有一个问题:最开始那一段是不符合这个周期的,因此需要找到这一段区间中会被错误加上1的部分,然后给它捡回去。由于最开始那一段长度不足一个周期,因此不会影响复杂度。

这个找多余贡献的部分我没有想到比较简单的处理方法(因为一个区间在模意义下可能拆成两个),因此我写了很蠢的四个区间求交。这一部分就占了4kb。

直接在做 dfs 的时候进行这个过程,利用「DFS 子树前和 DFS 完子树后权值的差」得到子树的贡献。就做完了。O(nlognlogV)跑的似乎比3个log和1个log都要慢

posted @   rhineofts  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示