2022-12-7 #5 明白你不愿放弃的爱 现在沿途的风景依然精彩
——校长《明日DISCO》
今天看了看 Stern-Brocot 树,发现啥都不记得了。
性质:二叉搜索树,最简性、唯一性、覆盖性。
\((a,b),(c,d)\) 以某种方式相邻的充要条件是 \(|ad-bc|=1\)。
从根结点到结点 \(\frac ab\) 只需跳跃 \(O(\log \max\{a,b\})\) 条相同方向的链。
注意一棵子树 \((a,b),(c,d)\) 到左、右儿子的移动是线性变换,可以用矩阵刻画。(结合上面的性质,跳跃相同方向的链可以矩阵快速幂)
还有一种理解是把分数理解成平面向量,分数值即为斜率。
21 ABC273Ex Inv(0,1)ving Insert(1,0)n
只需建出 \(n\) 个分数在 SBT 上的虚树,然后统计每个点被统计的次数,这个可以使用启发式合并解决。
递归建立虚树,若当前点是一个分叉点,直接递归左右,否则要跳一段相同方向的链,类似解一个 \(\frac{a+kc}{b+kd}>p\) 的 \(k\) 最大值,\(O(1)\) 计算即可。
22 ARC123F Insert Addition
尝试将其向 SBT 上靠,我们用一个数对 \((u,v)\) 表示一个整数 \(p=au+bv\),这样生成的序列就是 SBT 的形式了。
我们在 SBT 上跳,先找到 \(L\) 对应的位置,然后直接 dfs 就可以输出剩下数了,由于树深度不超过 \(n\),我们只会遍历到最多 \(n+R-L+1\) 个数。
问题在于计算一棵子树 \((p,q)\) 的大小,我们使用莫比乌斯反演:
容易 \(O(n\log n)\) 计算,也可以数论分块+类欧几里得 \(O(\sqrt n\log n)\)。
注意跳相同方向的链需要倍增地跳,复杂度 \(O(n+\sqrt n\log^3 n)\)。
23 ARC149F Rational Number System
建立所有数的 trie 树,与上一题类似地在 trie 树上遍历。
二分走哪个儿子,问题转化为 \([l,r]\) 子树大小之和,这个枚举一下深度就做完了。
24 P8258 [CTS2022] 独立集问题
注意到某个位置操作了之后,我们可以给它再操作一次来取反。于是问题可以刻画成:操作一个点,就将它的点权减它附近的点的点权和的绝对值(由于答案是求最大值,这个绝对值可以拆)加入答案,并把操作到的点的点权归零。
这样就可以直接 dp 了,细节较多。
24 P8860 动态图连通性
先离线,原问题等价于一个最短路,其中第 \(i\) 次操作被删除的边赋权 \(2^{q-i+1}\)(有多次操作只考虑第一次),其余赋权 \(0\)。
直接 dijkstra,使用主席树维护即可做到 \(O(n\log n)\),但空间不优秀,也不优美。(类似 CF464E)
事实上这题是比 CF464E 弱的,因为非零边权互不相同,也就是说不会出现“进位”的情况。
主席树的作用主要是比较 \(dis_{s_1}+w_1\) 与 \(dis_{s_2}+w_2\) 的大小,不妨令 \(dis_{s_1}<dis_{s_2}\),那么 \(dis_{s_1}+w_1>dis_{s_2}\)。(否则我们都不需要考虑 \(s_2\))
于是 \(w_1\) 一定是加在了 \(lcp(dis_{s_1},dis_{s_2})\) 中的某个 \(0\) 上,那么若 \(w_2\leqslant w_1\),则 \(dis_{s_2}+w_2\) 更小,否则 \(dis_{s_1}+w_1\) 更小,也就是我们只需比较最后一步的边权。(若边权相同,此时 \(d_i=0\),我们可以任意处理)
于是做到了线性空间,以及极低的实现难度。
25 ABC279Ex Sum of Prod of Min
这个 \(\min\) 对应的 GF 可以直接列出:(一个差分状物)
答案即:
由于 \(m-n\leqslant n\),所以求积式的上界可以忽略,此时我们应用五边形数定理:
右边只有 \(O(\sqrt n)\) 项,枚举一下,左边 \(O(1)\) 提取系数就好了。
26 ABC275Ex Monster
建出笛卡尔树,一次操作只会操作笛卡尔树的一棵子树。
令 \(F_u(x)\) 表示 \(u\) 子树中,操作到最大值为 \(x\) 的最小代价:(特判掉叶子)
归纳可知 \(F_u\) 凸,使用 slope trick,仅维护斜率变化点以及变化量。
先将儿子的 \(F\) 加起来,然后分阶段完成转移:
第一、三步只需插入斜率变化点,第二步将 \(<A_u\) 的斜率变化点、以及斜率小于 \(0\) 的一段前缀拍平。
使用左偏树维护即可做到 \(O(n\log n)\)。
草,大意了,下午晚上都在摆。
27 P7605 [THUPC2021] 小 E 爱消除
比较简单,列出区间 dp,讨论左端点与哪个位置匹配,这样转化为“\([l_1,r_1],[l_2,r_2]\) 这些球消掉需要的最小栈大小”,这也可以区间 dp 解决。
复杂度是 \(O(n^6)\) 的,但是注意到很多情况都不合法,出题人表示其有 \(\frac 1{720}\) 的常数。
28 loj#6610. applese 爱数图
考虑将整张图分解成 \(k\) 个点双 \(S_{1,2,\cdots,k}\),记 \(G\) 的生成树个数为 \(F(G)\),有:
简单地考察某一个点双的 \(F\) 值:
- \(|E|=|V|\),此时一定为圈,\(F(G)=|V|\)。
- \(|E|=|V|+1\),此时一定为圈上任选两个点连一条路径,此时有两个三度点,记三条路径长度分别为 \(a,b,c\),那么 \(F(G)=ab+bc+ac\geqslant 3n-4\)。(\(a=1,b=2,c=n-2\))
- \(|E|>|V|+1\):这个我还不会证,反正其 \(F\) 值也不少于 \(3n-4\)。
因此,一个非平凡点双(\(|V|>1\))的贡献一定 \(\geqslant 3\),因此最多有两个非平凡点双。
那么开始分讨:
不存在非平凡点双:此时是一棵无根树,\(n^{n-2}\)。
一个非平凡点双:
- 圈:直接计算圆排列,\(\frac{(n-1)!}{2}\)。
- 非圈:此时 \(22\geqslant F\geqslant 3n-4\),那么 \(n\leqslant 8\),暴力枚举所有不超过 \(8\) 个点的无向图即可。
得到这个点双后,我们只需与其余的点组合起来,通过 prufer 序列“图联通方案数公式”,贡献即 \(n^{n-|V|-1}|V|\),带上一个组合数选出这些点。
两个非平凡点双:
我们可以直接枚举两个点双,计算组合在一起的方案数。观察到两个点至多有一个公共点,分讨计算即可。
复杂度其实不是很重要,大概是 \(O(k^2\log n+k^4)\)。
29 P5538 【XR-3】Namid[A]me
比较套路?
首先注意由于模数较小,可以通过预处理离散对数做到 \(O(1)\) 快速幂。
一个直接的想法是点分治,根据经典结论,一条链上,左端点到任意点的 \(f\) 值只有 \(\log a\) 种。那么以分治重心为一端的 \(f\) 值只有 \(O(d\log a)\) 种。
不妨考虑暴力枚举两种 \(f\) 值拼起来,这样的复杂度是 \(O(\min((d\log a)^2,n^2))\leqslant O(\sqrt{(nd\log a)^2})=O(nd\log a)\) 的。
事实上你回过头看,这个点分治的结构是毫无必要的,我们只是根据习惯使用了这一手段,把每条路径在 lca 处计算也是等价的。
另一种处理方式是将每个叶子依次设为根,根据经典结论,任意路径都会至少一次作为直链出现。尝试在直链的底端统计路径,即统计“在以 \(d_i\) 为根时是直链,以 \(d_{1\cdots i-1}\) 为根时不是直链”的路径。
假设路径 \(u\rightarrow v\) 被统计到了(\(u\) 是祖先,令 \(w\) 为 \(u\) 到 \(v\) 路径上第二个点),那么 \(d_{1\cdots i-1}\) 一定都在 \(w\) 的子树内。于是我们对 \(u\) 的限制仅为“深度大于等于某个值”。转化为直链后使用上面的结论可以直接 \(O(nd\log a)\) 解决。