noi前第十六场 题解

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\) 的做法,直接冲一个单调栈维护最值。
然后用线段树维护区间修改、全局最大值就好了。

posted @ 2020-07-30 17:52  skyh  阅读(181)  评论(0编辑  收藏  举报