UOJ Logo Rainbow_sjy的博客

博客

UOJ Easy Round #12 题解

2025-03-16 23:23:33 By Rainbow_sjy

电网检修

idea, solution, std, data by GeZhiyuan

这是一个结论题。假设树高为 $h$,我们对 $h$ 分类讨论:

当 $h < k$ 时:

  • 我们可以先假设 $k=n-1$ 即没有限制,然后两人在树上最终的位置分别是 $u, v$。此时不难发现两人最优情况下,相对于 $2(n-1)$ 能省去的总距离为 $u, v$ 间的距离 $d$。即我们要找到树的直径长度。
  • 然后我们考虑加上 $k$ 的限制。此时两人最终距离不会超出 $k$,因此省去的距离也不能超出 $k$。我们尝试证明答案能省去的距离即为 $\min(d, k)$。
  • 先找出直径两端点 $s, t$,然后不停将 $s$ 令为 $s$ 的父亲,直到 $s, t$ 距离小于等于 $k$,由于树高的限制,最终 $s$ 也不会成为 $t$ 的祖先,一定会有一时刻找到合适的 $s$。此时可以发现所有点和 $s$ 的距离都小于等于 $k$,而又有所有点和 $1$ 的距离都小于等于 $k$。因此只要先让伏特走,此时欧姆的位置一直在 $1$;再让欧姆走即,此时伏特的位置一直在 $s$。上述策略一定可以可满足题目限制。也就省去了 $\min(d, k)$ 的距离。

当 $h \geq k$ 时:

  • 不难发现,此时对于子树树高大于 $k$ 的点,两人都必须经过。因为对于一个深度大于等于 $k$ 的点,当两人中的某人到达这个叶子时,另一个人必定在其 $k$ 级祖先的子树内。也就是两人都经过了这个 $k$ 级祖先。 那么这样的 $k$ 级祖先所构成的点集即为子树树高大于 $k$ 的点构成的点集。
  • 假设子树树高大于 $k$ 的点构成的点集大小为 $m$。我们让两人分别去遍历整棵树,和子树树高大于 $k$ 的点构成的树。两树树高分别为 $h$ 和 $h-k$,根据经典结论相对于 $2(n-1)+2(m-1)$ 至多可以省去 $2h-k$ 的距离,并且发现可以轻松构造出一种移动策略达到这个值。此时答案即为 $2(n+m-2)-2h+k$。
  • 最后我们尝试证明其他策略一定不优于 $2h-k$。即对于一种其他的遍历到的点的分配方式。首先对于子树树高大于 $k$ 的点构成的树,一定都要被两人经过的点覆盖。而相当于其他的点我们要去分配给两个人。而我们有两人最终位置距离不超过 $k$。首先对于子树树高大于 $k$ 的点构成的树,两人省去的路径长度不超其树高两倍,即不超 $2h-2k$。而对于不在这个树内省去的距离,由于两人距离不超 $k$,因此也至多省去 $k$。综省去的距离不超 $2h-k$。

于是此题就在 $O(n)$ 内得以解决。

If there exists maxdep >= k, consider the component formed by the k-th ancestors of all nodes. Volt walk through all the tree, Ohm walk through the component. The answer is: 2*(n-1)-maxdep-(maxdep-k).

Otherwise, the two people can move to two leaves within some subtree, reducing the distance by min(diameter,k). The answer is: 2*(n-1)-min(diameter,k).

电子运动

idea, solution, std, data by Rainbow_sjy

算法 I

分析电子掉出去后,最终的结构是什么。

假设电子是从左边掉出去的(如果是右边则把所有操作反一下)。

假设电子一开始放在 $i$ 位置,$[1,i]$ 中有 $x$ 个 +,$[i+1,n]$ 中有 $y$ 个 -

若 $x\le y$,此时电子是从左边掉出去的,且 $[1,i]$ 全部变成 +,$[i+1,n]$ 中的前 $c$ 个 - 变成 +,其中 $c$ 是 $[1,i]$ 中初始的 + 个数。

枚举初始位置,枚举往右边碰到的最远位置,用组合数计算。

对于右边掉出去的情况就反过来做一遍。时间复杂度 $O(n^2)$,期望得分 $64$。

算法 II

这个模型的结构是十分对称的,可以观察更多性质。

考虑电子从左边掉出去,且最后变成全是 + 的情况,此时需要满足:$[1,i]$ 的 + 个数等于 $[i+1,n]$ 的 - 个数。我们可以发现,此时初始序列里需要恰好有 $i$ 个 - 和 $n-i$ 个 +。(这个过程类似范德蒙德卷积)

进一步,考虑 $i$ 向左的第一个 - 和向右的第一个 +,设为位置 $x$ 和 $y$。那么电子走 $i\to x\to y\to i$ 的路径,恰好交换了 $x$ 和 $y$ 的符号。

当 $[1,i]$ 全部变为 - 后,可以随意交换 $[i+1,n]$ 中的 +

通过等价交换之后,可以把字符串看作一个前缀全是 -,一个后缀全是 +。于是我们可以发现一个神奇的结论:字符串是否等价只和其中 + 的总个数相关。

进一步讨论可以得到:初始位置是 $i$,有 $\ge n-i+1$ 个 +,则会减少 $n-i$ 个 +;否则会增加 $i$ 个 +

那么对于初始位置是 $i$,初始有 $j$ 个 +,则最终会有 $(i+j) \bmod (n+1)$ 个 +。于是用一次卷积即可解决问题,时间复杂度 $O(n\log n)$,期望得分 $100$。

电阻匹配

idea, solution, std, data by Kubic

算法 I

考虑 kth-minmax 容斥:

$$ \operatorname{kthmin}(S,k)=\sum\limits_{T\subseteq S,|T|\ge k}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\max(T) $$

转化为对于每个 $k$ 求出如下问题的答案;

  • 先将 $a_{1\dots 2n}$ 两两匹配,一对匹配的权值为两个元素之和。然后在 $n$ 对匹配中选出恰好 $k$ 对,一组方案的权值为选出的匹配的最大权值。求所有方案的权值和。

设 $V$ 为一个足够大的值。则有:

$$ \max(S)=V-\sum_{w=0}^{V-1}\prod_{i\in S} [i\le w] $$

考虑枚举 $w$ 计算这个 $w$ 对答案的贡献。可以发现本质不同的 $w$ 只有 $O(n^2)$ 种。

我们将数分为 $\le\dfrac{w}{2}$ 和 $>\dfrac{w}{2}$ 两种,分别设为序列 $p,q$。

我们需要关注选出恰好 $k$ 对 $\le w$ 的匹配的方案数,剩余的 $n-k$ 对匹配可以在剩余的 $2(n-k)$ 个元素之间任意进行,方案数容易计算。

不妨设 $p$ 不降,$q$ 不增。

显然一个 $q$ 中的元素能匹配的一定是 $p$ 的一段前缀,而 $p$ 中的元素之间可以任意匹配。

设 $r_i$ 表示最大的数满足 $p_{r_i}+q_i\le w$。

设 $f_{i,j}$ 表示考虑 $q_{1\dots i}$,其中共进行了 $j$ 对 $p,q$ 间的匹配的方案数。

显然有转移方程:

$$ f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times (r_i-j+1) $$

设从 $i$ 个数种任意选出 $j$ 对匹配的方案数为 $c_{i,j}$。显然有:

$$ c_{i,j}=\dfrac{i!}{j!(i-2j)!2^j} $$

则一个 $w$ 对答案的贡献为:

$$ \sum f_{|p|,i}\times c_{|q|-i,k-i} $$

这两部分的时间复杂度均为 $O(n^2)$,而我们需要对每个 $w$ 做一遍。于是我们得到了一个总时间复杂度 $O(n^4)$ 的算法。

算法 II

考虑优化上述算法。

可以发现,第二部分中我们可以将 $|q|$ 相同的 $w$ 对应的 $f$ 放到一起计算贡献,而一共只有 $O(n)$ 种不同的 $|q|$。因此这一部分的时间复杂度容易优化到 $O(n^3)$。

现在的瓶颈在于对每个 $w$ 计算 $f$。

设 $g_{i,j}=f_{i,i-j},G_i(x)=\sum g_{i,j}x^j$。则有:

$$ g_{i,j}=g_{i-1,j-1}+g_{i-1,j}\times(r_i-i+j+1) $$

$$ G_i(x)=(x+r_i-i+1)G_{i-1}(x)+xG'_{i-1}(x) $$

设 $H_i(x)=e^xG_i(x)$。则有:

$$ H_i(x)=(r_i-i+1)H_{i-1}(x)+xH'_{i-1}(x) $$

$$ [x^j]H_i(x)=(r_i-i+j+1)[x^j]H_{i-1}(x) $$

因此我们可以在 $O(n)$ 的时间复杂度内计算出 $H_{|p|}(x)$。

但是通过 $H_{|p|}(x)$ 得到 $f_{|p|,*}$ 是 $O(n^2)$ 的,我们不能对于每个 $w$ 都进行处理。

与之前类似地,对于 $|q|$ 相同的 $w$,我们可以先将它们对应的 $H_{|p|}(x)$ 叠加起来得到 $H(x)$,然后计算 $G(x)=\dfrac{H(x)}{e^x}$,进一步得到 $f_{|p|,*}$ 叠加的结果。

这样我们就能在 $O(n^3)$ 的时间复杂度内得到转化后问题的答案。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。