csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」

改了两天,终于将T1,T3毒瘤题改完了...

T1 施工(单调栈优化DP)

考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解

正解是很**的单调栈

可以想象到最优情况一定是将两端高于中间的一段平原填成一段平的坑,不然如果坑内存在高度差那么我们即使只将一部分抬升也肯定没有用处,并且如果中间的坑已经高于了两端,再向上升也肯定不优,然后就中间的坑可以很很小,也可以很长,对于这个模型我们首先想到n^2*h的DP

设当前表示的f[i]表示当前到了i节点并且i节点高度不变时的花费,那么能转移到他的其实只有高于i节点高度的点,那么我们

其实可以考虑用单调栈维护

然后对于h的最优高度化简后是一个二次函数的形式,然后直接求解就好,然后求二次函数时要注意解的范围,也要注意解是否为整数,然后打了很久..........

T2 蔬菜

正解????然后就打暴力吧,二维莫队,时间复杂度不会

T3 联盟

树上直径的好题,改了一个晚上+两节自习

首先关于树上直径有个性质:

    距离所有点的最远距离最小的点是直径的中点

那么这题拆的边肯定是直径上的边啦

但是我们需要求出两个联通块的直径,但是好像我们只会n^2处理.......

但是我们发现假如我们断的边不是直径上的边那么断开后一个联通块的直径一定是原直径

我们可以将直径拎直,然后以两个端点DP,求出了两个数组,分别表示两个联通块的子树的直径,

设断开的联通块直径分别为L1,L2

对于直径边,新连的直径一定是L1,L2,(L1/2(向上取整)+L2/2(向上取整))+1,的最大值

所以直接判断,然后最后随便找出两个断点,找出新连的边即可

(没有处理多直径的情况,不会.....)

猜你喜欢

转载自www.cnblogs.com/Wwb123/p/11577650.html