做题记录 25.2.3
\(\textcolor{purple}\odot\) [ABC329G] Delivery on Tree
以下默认 \(l=\operatorname{lca}(s,t)\),令 \([u\to v)\) 表示 \(u\) 到 \(v\) 的有向路径上的节点,含 \(u\) 但不含 \(v\),\((u\to v)\) 同理
显然要求遍历过程为 \(dfs\)
因为为二叉树,每个节点儿子至多两个,因此只要对于两个儿子的节点决策两个儿子遍历的顺序即可
对于一条路径 \(s\to t\),若 \(l\ne s\) 且 \(l\ne t\),令 \(ls\) 为 \(l\) 的 \(s\) 方向上的儿子,\(lt\) 为 \(t\) 方向上的儿子,则由于 \(s\) 必须在 \(t\) 的前面访问,对于节点 \(l\) 这相当于强制令 \(ls\) 在 \(lt\) 之前遍历,以下称此为一条 限制
若存在两条限制互相冲突,则显然答案为 \(0\)
先考虑最优情况,即每个球在起点处拿起后直达终点,中间没有绕路
令 \(L^{\uparrow}_u\) 表示所有给定的有向路径中,包含有向边 \(u\to fa_u\) 的数量,\(L^{\downarrow}_u\) 表示包含 \(u\gets fa_u\) 的数量,\(u=1\) 时两者为 \(0\)
则对于每条路径 \(s\to t\),会令 \([s\to l)\) 所有点的 \(L^{\uparrow}_\ast\) 加一,令 \([t\to l)\) 所有点的 \(L^{\downarrow}_\ast\) 加一
容易树上差分 \(O(m\log n+n)\) 求出所有 \(L^{\uparrow}_\ast\) 和 \(L^{\downarrow}_\ast\),其中 \(O(\log n)\) 为求 \(\operatorname{lca}\) 的时间复杂度
令 \(L_u=\max(L^{\uparrow}_u,L^{\downarrow}_u)\),则若存在一个 \(L_u>k\),答案一定为 \(0\)
然后考虑绕路的影响
对于一条路径 \(s\to t\)
对于 \((s\to l)\) 中某一点 \(p\),设其在路径 \(s\to l\) 中上一个点为 \(u\),则 \(u\) 为 \(p\) 的某个儿子
假定 \(p\) 有两个儿子(否则忽略这个 \(p\)),其另一个儿子为 \(v\)
若最终方案中 \(dfn_u<dfn_v\),从 \(s\) 到 \(t\) 的过程中必然会经过子树 \(v\) 中所有点和边(包含边 \(v-p\)),即对于每个 \(x\in subtree(v)\),\(L^{\uparrow}_x\) 和 \(L^{\downarrow}_x\) 都加一,等价于 \(L_x\) 加一
令 \(c^{\uparrow}_u\) 表示若 \(dfn_u<dfn_v\),子树 \(v\) 内 \(L_\ast\) 的增加量,其中 \(v\) 为 \(u\) 的兄弟(若不存在,则 \(c^{\uparrow}_u=0\))
若 \(s\ne l\),令 \(pr\) 为 \(s\to l\) 上 \(l\) 之前的点,则该路径会令 \([s\to pr)\) 的 \(c^{\uparrow}_\ast\) 加一
类似地定义 \(c^{\downarrow}_u\),表示若 \(dfn_u>dfn_v\)(与 \(c^{\uparrow}_u\) 相比仅有此处 符号不同),子树 \(v\) 内 \(L_\ast\) 的增加量,其中 \(v\) 为 \(u\) 的兄弟(若不存在,则 \(c^{\downarrow}_u=0\))
此时若 \(t\ne l\),令 \(sf\) 为 \(l\to t\) 上 \(l\) 下一个点,该路径会使 \([t\to sf)\) 的 \(c^{\downarrow}_\ast\) 加一
两者同样使用树上差分求出
预处理的总时间复杂度为 \(O(m\log n+n)\)
接下来为 \(dp\)
令 \(dp_{i,j}\) 表示子树 \(i\) 中,令子树中点的 \(L_\ast\) 的最大值为 \(j\) 的方案数,则最终答案为 \(\sum_{0\le j\le k} dp_{1,j}\)
对于叶子节点 \(i\),显然 \(dp_{i,L_i}=1\),其余为 \(0\)
对于只有一个儿子 \(u\) 的节点 \(i\),显然只要考虑 \(i\to fa_i\) 的影响即可,对于所有 \(0\le j\le k\),令 \(f_{i,\max(j,L_i)}\gets f_{u,j}\)
对于有两个儿子 \(u,v\) 的节点 \(i\),计算 \(dfn_u<dfn_v\) 的情况(大于的情况交换两者即可,注意判断是否满足之前的限制),转移为
暴力实现为 \(O(nk^2)\) 的,无法承受
分别考虑 \(j+c^{\downarrow}_v\le l+c^{\uparrow}_u\) 和 \(j+c^{\downarrow}_v> l+c^{\uparrow}_u\) 的情况,分别前缀和优化即可到 \(O(nk)\)
总时间复杂度 \(O(nk+m\log n)\)

浙公网安备 33010602011771号