2022-12-7 #5 明白你不愿放弃的爱 现在沿途的风景依然精彩
——校长《明日DISCO》
今天看了看 Stern-Brocot 树,发现啥都不记得了。
性质:二叉搜索树,最简性、唯一性、覆盖性。
以某种方式相邻的充要条件是 。
从根结点到结点 只需跳跃 条相同方向的链。
注意一棵子树 到左、右儿子的移动是线性变换,可以用矩阵刻画。(结合上面的性质,跳跃相同方向的链可以矩阵快速幂)
还有一种理解是把分数理解成平面向量,分数值即为斜率。
21 ABC273Ex Inv(0,1)ving Insert(1,0)n
只需建出 个分数在 SBT 上的虚树,然后统计每个点被统计的次数,这个可以使用启发式合并解决。
递归建立虚树,若当前点是一个分叉点,直接递归左右,否则要跳一段相同方向的链,类似解一个 的 最大值, 计算即可。
22 ARC123F Insert Addition
尝试将其向 SBT 上靠,我们用一个数对 表示一个整数 ,这样生成的序列就是 SBT 的形式了。
我们在 SBT 上跳,先找到 对应的位置,然后直接 dfs 就可以输出剩下数了,由于树深度不超过 ,我们只会遍历到最多 个数。
问题在于计算一棵子树 的大小,我们使用莫比乌斯反演:
容易 计算,也可以数论分块+类欧几里得 。
注意跳相同方向的链需要倍增地跳,复杂度 。
23 ARC149F Rational Number System
建立所有数的 trie 树,与上一题类似地在 trie 树上遍历。
二分走哪个儿子,问题转化为 子树大小之和,这个枚举一下深度就做完了。
24 P8258 [CTS2022] 独立集问题
注意到某个位置操作了之后,我们可以给它再操作一次来取反。于是问题可以刻画成:操作一个点,就将它的点权减它附近的点的点权和的绝对值(由于答案是求最大值,这个绝对值可以拆)加入答案,并把操作到的点的点权归零。
这样就可以直接 dp 了,细节较多。
24 P8860 动态图连通性
先离线,原问题等价于一个最短路,其中第 次操作被删除的边赋权 (有多次操作只考虑第一次),其余赋权 。
直接 dijkstra,使用主席树维护即可做到 ,但空间不优秀,也不优美。(类似 CF464E)
事实上这题是比 CF464E 弱的,因为非零边权互不相同,也就是说不会出现“进位”的情况。
主席树的作用主要是比较 与 的大小,不妨令 ,那么 。(否则我们都不需要考虑 )
于是 一定是加在了 中的某个 上,那么若 ,则 更小,否则 更小,也就是我们只需比较最后一步的边权。(若边权相同,此时 ,我们可以任意处理)
于是做到了线性空间,以及极低的实现难度。
25 ABC279Ex Sum of Prod of Min
这个 对应的 GF 可以直接列出:(一个差分状物)
答案即:
由于 ,所以求积式的上界可以忽略,此时我们应用五边形数定理:
右边只有 项,枚举一下,左边 提取系数就好了。
26 ABC275Ex Monster
建出笛卡尔树,一次操作只会操作笛卡尔树的一棵子树。
令 表示 子树中,操作到最大值为 的最小代价:(特判掉叶子)
归纳可知 凸,使用 slope trick,仅维护斜率变化点以及变化量。
先将儿子的 加起来,然后分阶段完成转移:
第一、三步只需插入斜率变化点,第二步将 的斜率变化点、以及斜率小于 的一段前缀拍平。
使用左偏树维护即可做到 。
草,大意了,下午晚上都在摆。
27 P7605 [THUPC2021] 小 E 爱消除
比较简单,列出区间 dp,讨论左端点与哪个位置匹配,这样转化为“ 这些球消掉需要的最小栈大小”,这也可以区间 dp 解决。
复杂度是 的,但是注意到很多情况都不合法,出题人表示其有 的常数。
28 loj#6610. applese 爱数图
考虑将整张图分解成 个点双 ,记 的生成树个数为 ,有:
简单地考察某一个点双的 值:
- ,此时一定为圈,。
- ,此时一定为圈上任选两个点连一条路径,此时有两个三度点,记三条路径长度分别为 ,那么 。()
- :这个我还不会证,反正其 值也不少于 。
因此,一个非平凡点双()的贡献一定 ,因此最多有两个非平凡点双。
那么开始分讨:
不存在非平凡点双:此时是一棵无根树,。
一个非平凡点双:
- 圈:直接计算圆排列,。
- 非圈:此时 ,那么 ,暴力枚举所有不超过 个点的无向图即可。
得到这个点双后,我们只需与其余的点组合起来,通过 prufer 序列“图联通方案数公式”,贡献即 ,带上一个组合数选出这些点。
两个非平凡点双:
我们可以直接枚举两个点双,计算组合在一起的方案数。观察到两个点至多有一个公共点,分讨计算即可。
复杂度其实不是很重要,大概是 。
29 P5538 【XR-3】Namid[A]me
比较套路?
首先注意由于模数较小,可以通过预处理离散对数做到 快速幂。
一个直接的想法是点分治,根据经典结论,一条链上,左端点到任意点的 值只有 种。那么以分治重心为一端的 值只有 种。
不妨考虑暴力枚举两种 值拼起来,这样的复杂度是 的。
事实上你回过头看,这个点分治的结构是毫无必要的,我们只是根据习惯使用了这一手段,把每条路径在 lca 处计算也是等价的。
另一种处理方式是将每个叶子依次设为根,根据经典结论,任意路径都会至少一次作为直链出现。尝试在直链的底端统计路径,即统计“在以 为根时是直链,以 为根时不是直链”的路径。
假设路径 被统计到了( 是祖先,令 为 到 路径上第二个点),那么 一定都在 的子树内。于是我们对 的限制仅为“深度大于等于某个值”。转化为直链后使用上面的结论可以直接 解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示