晚上脑子十分不清醒(准确说是进shi了,一直想换条裤子???,什么sb强迫症)
于是还是写下题解吧。
模拟20 任
保证若连通任意两点只有一条简单路径,说白了就是森林 无环图。
假设一个连通块的节点数是n,由于它一定是树,所以边数为n-1。
然后我们可以归纳得出结论:连通块数=点数-边数。
很容易想到二维前缀和,分别维护点和边。
点很容易解决,小容斥即可。
边的话不好划分,对于这种界限不清的问题,可以规定。
我们规定一个点的边只考虑右和下。
这样我们可以得到任意一个边矩阵,对于矩阵右和下统计多的部分维护行和列的连边考虑即可。
最小生成树:
模拟23 water
一个点的水位高度是从这个点出发到达边界的所有(路径上的最大值)的最小值
换言之就是 找到一个路径使路径上的最大边权最小,求这个最小值。
我们来证明下:
设x是上面所求,h是这个点的水位高度
显然这个点只要有一个路径能够到达边界,那么不满足
假设h比x大,如果我们仍走这条路径,那么不满足,因为x是这条路上的最高点了,没有点可以挡住水流,(这条路)已经可以通到边界了。
由于上面已经有一条路径不满足,h不可能大于x
假设h比x小,这条路径满足,其他路径上的最大权值一定大于等于x,那么其他路径同理满足。所以可以增大h。
综上h=x。
那么考虑如何求x。
其实这是一类问题。
对于最大值最小,最小值最大,很容易联想到二分,用二分卡住一维,然后把这一维当作已知条件去求解另一维,然后通过判断合法性来调整二分。
这个题也具有单调性,然而对每个块二分复杂度不允许。
我们需要一个整体的求解方法:
最小/大生成树。
对每个块连边,边权为两个块的高度的较大值,边界为max(高度,0),然后跑Krus,根为边界,答案就是这个点到根的最大边权。
最小生成树保证了每个点到边界的路径上的最大值尽可能小,然后找到这个最大值即可。
模拟24 Star Way To Heaven
解法一:一眼二分,不会验证,准确说是一想到实数就放弃了。。。
二分所以star的半径和边界的宽度,然后验证存不存在从左到右的通路。
实际上验证很简单。只要换种角度。
连通不好判,不联通还是可以的。
并查集,把所有有交集的圆放到一个集合,记录上下边界,边界特判,然后看存不存在一个集合的上下边界卡住m。复杂度O(k^2logm)
解法二:求最小距离的最大值。同上最小生成树!
用最小生成树描出边界,注意要break出去,因为到了边界还可以走回来。
那么这个树实际上是边界的最紧密连接情况,即从左到右必须要经过的所有最坏情况。
答案就是树上的最大边权/2