其他分享
首页 > 其他分享> > 最近一些题的题解

最近一些题的题解

作者:互联网

1. 摩尔庄园

用树形 dp 模拟网络流。

记 \(a\) 为 \(x\) 走向 \(fa(x)\) 的次数,\(b\) 为 \(fa(x)\) 走向 \(x\) 的次数,\(flw(x) = a - b\)。

这样在从 \(x\) 走向 \(fa\) 时:

从 \(fa\) 走向 \(x\) 时是类似的。

从下往上进行 \(\rm Update\),计算从 \(x\) 到其子树中有食物的地方,费用最小是多少,并记录下那个点的编号。

每读入一只拉姆的位置,就计算其费用并更新图中的费用。

Code

2. Centroids

CF708C 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} } \]

Code

3. 由乃与大母神原型和偶像崇拜

P3792 由乃与大母神原型和偶像崇拜

发现 \(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 $ 自然溢出,注意等差数列与平方和都要除一个数,把它乘到式子另一边去。

当然你怕不保险也可以加上立方和,这样就几乎卡不掉了(

Code

标签:siz,cut,dfrac,子树,fa,最近,题解,一些,mx
来源: https://www.cnblogs.com/mangoworld/p/Solution-Recent-Problem.html