杂题(二)
要退役做一些自己感觉好久没做过或者没学过的题。
P6626 [省选联考 2020 B 卷] 消息传递
套路点分治,把询问挂在点上,然后就是每次处理跨越重心的路径,贡献到目前的每个点上。
P2664 树上游戏
对颜色进行计数,乍一看不可做,但是经过推导之后发现可以直接上点分,路径贡献到点上,差分,用 dfs 去除一些多余颜色贡献。
CF715C Digit Tree
不想多说,煞笔至极,直接记模 余数,然后一个数的后半段匹配前半段,正好要 的逆元。
P4075 [SDOI2016] 模式字符串
上点分,中间一段显然用哈希,其他完全是 的部分直接 DFS 记录 级父亲到这里是否合法即可,记录祖先哈希就行。不想写了。
P2305 [NOI2014] 购票
写几个做法。
第一个是有根树点分。先处理根的子树,然后剩下子树就是这个分治中心到根这条链的贡献,可以扫描线上李超线段树维护转移。
第二个是直接树剖,树剖成 个前缀和 个区间,区间用线段树套李超线段树,前缀扫一遍李超线段树就行。
第三个用出栈序作为线段树套李超线段树的下标,发现对于目前这个点,只有祖先没有出栈,也就是说访问过的点中,只有祖先在该点出栈序之后,并且能够发现祖先是按顺序排的,也就是说可以直接用 目前的点的出栈序 到 目标祖先的出栈序 这个区间进行转移。
CF1746F Kazaee
挺离谱的。随机映射 次 ,其中 是随机的一个序列,每次检验区间和是否是 的倍数。可以理解为每次均匀分布,所以出错概率是 ,取 大概一定能过了。但是如果你写的不是二分离散化那有可能被卡哈希表需要卡常。
P4899 [IOI2018] werewolf 狼人
某个点分树博客应该会用到这个题的做法。
建立两棵 Kruskal 重构树(因为是点权所以把点权拍到边权上,注意取 或 ),一个最小,一个最大。找到最大树中 可到的所有 的点和最小树中 可到的所有 的点,显然这是两棵子树。只需要这两棵子树 的点集部分有交即可。在第一棵树上 dsu,然后第二棵树 BIT 维护子树和即可。
P3703 [SDOI2017] 树点涂色
据说名称叫树上 access 均摊。
显然每个颜色段是一条祖先链。考虑暴力加入另外一个到根颜色段,我们会将一部分颜色段的一部分削减,考虑尝试证明均摊,以下设 同阶。
首先到根颜色段至多走 次轻边,所以这一部分一定不会超过 次。每个链最后会被削减成只在一条重链上,直接覆盖它的总复杂度为 。
然后讨论走重边的情况,显然我们可以维护哪些点的所在颜色段走了这个点的某条轻边,这样会使某个颜色段轻边数量减一,而这条被删的轻边目前不会再被加入,所以这个删除是将所有链的总轻边数量减一。所以我们走重边会更改的部分是与 所有加入的链的总轻边数 同阶的,也就是 。
所以我们证明了暴力更改的总次数是 的。显然这个题只需要把 挂在每个颜色段顶即可。用一个 set 维护重链上有哪些位置是 和重链上有哪些位置的颜色段往深走一步会走轻边即可。然后就用线段树维护 操作。可以分讨得到 操作答案为 ,其中 是到根链点权和。时间复杂度 2log。
P9340 [JOISC 2023 Day3] Tourism
和上一题差不多,但是均摊分析变成了每个重链上都有一个颜色段均摊,因为维护方式改变了。
考虑扫描线,进行到根链覆盖操作,不难发现等价于一个贪心,使得每个位置覆盖的时刻最靠后。那么我们只需要统计每个区间的连通块的深度最小值和连通块加深度最小值大小即可。前者可以在覆盖其他段的时候对其他段颜色加入时刻 及之前的所有位置取 ,作为 LCA 位置,注意需要特判重链前缀的末尾的去向,如果和原去向一直那么不能贡献 LCA。后者显然直接对于 这个区间加上链长,因为原来这一段只可能在 的时刻有贡献,现在 的时刻都有贡献了,需要补齐。
用两个 BIT 维护。2log。
本文作者:xingyu_xuan
本文链接:https://www.cnblogs.com/xingyuxuan/p/18646457
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步