最近一些题的题解
作者:互联网
1. 摩尔庄园
用树形 dp 模拟网络流。
记 \(a\) 为 \(x\) 走向 \(fa(x)\) 的次数,\(b\) 为 \(fa(x)\) 走向 \(x\) 的次数,\(flw(x) = a - b\)。
这样在从 \(x\) 走向 \(fa\) 时:
- 如果 \(flw(x) < 0\),表示有更多次从 \(fa\) 走向 \(x\),那么这一次费用为 \(-1\),表示和之前一次从 \(fa\) 走向 \(x\) 的费用抵消了(网络流的思路)。
- 否则,无法抵消,费用为 \(1\)。
从 \(fa\) 走向 \(x\) 时是类似的。
从下往上进行 \(\rm Update\),计算从 \(x\) 到其子树中有食物的地方,费用最小是多少,并记录下那个点的编号。
每读入一只拉姆的位置,就计算其费用并更新图中的费用。
2. Centroids
一个优秀的性质是以重心为根时所有点的子树大小都不会超过 \(\dfrac{n}{2}\),因为根本身就是如此。
对于节点 \(u\),这时只有 \(u\) 上面的部分有可能超过 \(\dfrac{n}{2}\),那么最优策略是选择其中最大的不超过 \(\dfrac{n}{2}\) 的子树,把它接到 \(u\) 上,设这一部分的大小为 \(cut_u\),那么剩下的部分就是 \(n - siz_u - cut_u\),如果仍然大于 \(\dfrac{n}{2}\),那么无法成为重心;否则可以。
于是问题转为如何求 \(cut_u\)。
记录 \(mx_u\) 为 \(u\) 子树内(不包括 \(u\))最大的不超过 \(\dfrac{n}{2}\) 的子树大小,当从 \(u\) 转移到 \(v\) 时:
\[cut_u = \cases { \max(cut_u, n - siz_u), n - siz_u \le \dfrac{n}{2} \\ cut_u, \rm otherwise } \\ cut_v = \max(cut_u, mx_u) \]但如果 \(v\) 的子树就是 \(u\) 的最大的不超过 \(\dfrac{n}{2}\) 的子树,这时 \(mx_u\) 是不能选的,所以我们应该记录最大值和次大值 \(mx_{u,0}, mx_{u, 1}\)。这样转移就变成了
\[cnt_v = \cases { \max(cut_u, mx_{u, 0}), siz_v \ne mx_{u, 0} \\ \max(cut_u, mx_{u, 1}), siz_v = mx_{u, 0} } \]3. 由乃与大母神原型和偶像崇拜
发现 \(n\) 个数的和容易重,但平方和就不好重。所以维护区间最小 \(mn\)、区间最大 \(mx\)、区间和 \(sum1\)、区间平方和 \(sum2\)。
首先判断 \(mn + len - 1\) 是否等于 \(mx\),然后求 \(\sum\limits_{i = mn}^{mx} i\) 是否等于 \(sum1\),\(\sum\limits_{i = mn}^{mx}i ^2\) 是否等于 \(sum2\)。
模数直接 $\rm unsigned\ long\ long $ 自然溢出,注意等差数列与平方和都要除一个数,把它乘到式子另一边去。
当然你怕不保险也可以加上立方和,这样就几乎卡不掉了(
标签:siz,cut,dfrac,子树,fa,最近,题解,一些,mx 来源: https://www.cnblogs.com/mangoworld/p/Solution-Recent-Problem.html