##A. 小B的班级 莫名想到了一个结论,这种题可以找到选中的点形成的重心。 然后求所有点与重心距离的和即可。 原因是,任意一个子树大小均小于 \(m\),所以总可以构造出方案。 在这道题中,只要枚举最接近 $1$ 号点的可能的重心,然后计算方案数就可以 \(O(n^3)\)

仔细想一下,可以把每个点到达重心的距离摊到每条边的贡献上。 直接套用上面得出的结论,可以知道贡献的系数就是 \(\min\{sz_a,sz_b\}\),然后随便写写这题就没了。   ##B. 小B的环 首先断环成链,把所有相邻并且相同的位置打个标记。 每次的操作就是要求覆盖环内所有标记,找出位置不同的两个点,然后做类似卷积的东西。 发现不会做,但是可以想一想暴力。 因为左右端点每次都是右移一位,每次的变化量并不大,所以只要考虑新加入的右端点的贡献。 写个类似链表的东西剪剪枝,\(O(n^2)\) 就过了。

正解是这样的,考虑一个环在删除一段后保留的,也是一段连续区间。 所以可以直接由该字符串,拆出若干段区间,对其中每一段区间考虑首尾不同的限制。 因为拆出的区间是不交的,可以线性去枚举每个能保留的长度。 考虑不合法的情况,一定是说整个字符串存在一个该长度+1大小的循环节。 所以用 \(KMP\) 求个 \(border\) 来判断是否存在循环节就完了。   ##C. 小B的农场 可以发现这样一个事情,总存在一个周长为 $2\max{w,h}+2$ 的方案。 所以答案一定跨过 \(y=\frac{h}{2}\) 或者 \(x=\frac{w}{2}\)

两个问题是等价的,可以分别分治去求。 每次只要解决跨过 \(l,r\) 中点 \(mid\) 的答案。 所以要求的大概是 \(\min \limits_{i\leq mid,j > mid}\{ \min\{a_i,a_j\}+\min\{b_i,b_j\}+c_i+c_j \}\)。 这是一个二维数点问题,只要对其中一维排序,用数据结构维护另一维即可。

还有一个单 \(\log\) 的做法,直接冲一个单调栈维护最值。 然后用线段树维护区间修改、全局最大值就好了。