A. 小B的班级
莫名想到了一个结论,这种题可以找到选中的点形成的重心。
然后求所有点与重心距离的和即可。
原因是,任意一个子树大小均小于 (m),所以总可以构造出方案。
在这道题中,只要枚举最接近 (1) 号点的可能的重心,然后计算方案数就可以 (O(n^3))。
仔细想一下,可以把每个点到达重心的距离摊到每条边的贡献上。
直接套用上面得出的结论,可以知道贡献的系数就是 (min{sz_a,sz_b}),然后随便写写这题就没了。
B. 小B的环
首先断环成链,把所有相邻并且相同的位置打个标记。
每次的操作就是要求覆盖环内所有标记,找出位置不同的两个点,然后做类似卷积的东西。
发现不会做,但是可以想一想暴力。
因为左右端点每次都是右移一位,每次的变化量并不大,所以只要考虑新加入的右端点的贡献。
写个类似链表的东西剪剪枝,(O(n^2)) 就过了。
正解是这样的,考虑一个环在删除一段后保留的,也是一段连续区间。
所以可以直接由该字符串,拆出若干段区间,对其中每一段区间考虑首尾不同的限制。
因为拆出的区间是不交的,可以线性去枚举每个能保留的长度。
考虑不合法的情况,一定是说整个字符串存在一个该长度+1大小的循环节。
所以用 (KMP) 求个 (border) 来判断是否存在循环节就完了。
C. 小B的农场
可以发现这样一个事情,总存在一个周长为 (2max{w,h}+2) 的方案。
所以答案一定跨过 (y=frac{h}{2}) 或者 (x=frac{w}{2})。
两个问题是等价的,可以分别分治去求。
每次只要解决跨过 (l,r) 中点 (mid) 的答案。
所以要求的大概是 (min limits_{ileq mid,j > mid}{ min{a_i,a_j}+min{b_i,b_j}+c_i+c_j })。
这是一个二维数点问题,只要对其中一维排序,用数据结构维护另一维即可。
还有一个单 (log) 的做法,直接冲一个单调栈维护最值。
然后用线段树维护区间修改、全局最大值就好了。