旅行者
我不会高妙建树做法。喜提最劣解。差点被卡常,但是过了,赢。
考虑从后往前 dp,\(dp_i\) 为以 \(i\) 开头的路径方案数。考虑一个 \(i\) 能从哪些 \(j\) 转移来。发现 \(j\) 一定是从 \(i\) 开始,除了最后一个点,只经过 \(\le i\) 的点能到达的点。
这个条件容易让我们联想到 kruscal 重构树。建出重构树之后可以转换成一个链加单点茶的问题,树剖+BIT 解决。
但是发现原图上的边权不好处理。不过你最近做了点网络流,你会拆点。你把一个点拆成 \(\operatorname{deg}_i\) 个点,使每个点变成一条链,链上相邻点之间连边,并且每个点除了链上的边度数为 \(1\)。
然后你就发现这个图可以做了。但是你发现这样贡献会算重。因为每次进行一个点到根的路径+显然会重复。
但是我们有解决方案:将每个要更新的点按照 \(\operatorname{dfn}\) 排序,然后 \(a_1\to a_2\) 路径+,\(a_2\to a_3\) 路径+\(\cdots\)(这些要除了 \(\operatorname{lca}\)),\(a_1\to \operatorname{root}\) 路径+,\(a_k\to \operatorname{root}\) 路径+。然后每个点的值 \(\times\dfrac{1}{2}\) 就是真实值了!
但是 @Explodingkonjac 学长有更好的基于一点小差分的方法:变成每个点单点+,\(\operatorname{lca}\)-,求子树和。不用树剖,成为理论最优复杂度!/bx

浙公网安备 33010602011771号