标签:mat test 分析 另一个 并且 修改 单调队列 原来 复杂
打了 Comet OJ 的三道题
A是Comet OJ - Contest #1 C
B是Comet OJ - Contest #7 D
C是Comet OJ - Contest #8 F
A是一个超级恶心的状压题,但是有一个不会证明的结论可以水过去
B一眼看出得到极值的A和B一定可以是在某个\(x_i\)处取到,并且\(A<=B\)
发现答案式子有\(A*B\)
直接从小到大维护关于A的凸包,同时B在上面查极值就好了
用单调队列维护凸包即可
C大毒瘤题我只会\(k<=2\)
改题,发现C题题解说\(k=i\)的答案就是在\(k=i-1\)上加一个点
因为\(k=2\)就是选择直径
于是考虑以直径的一个端点为根做长链剖分,每次加入最长的长链就可以算出答案
但是带修改就很zb
我们发现甚至会更改直径的端点也就是根
于是考虑lct维护
每条实链其实就是一条长链
由于修改只会变大,所以只需要跳每一个长链的顶端看下能否换长儿子
就像access一样每次跳到实链顶上去看能不能换长儿子,不能换就break
复杂度跟lct的分析类似
最后考虑换根,由于权值只会变大,同时注意到跟一个点距离最远的点一定是直径的一个端点
所以新直径的一个端点一定是原来直径的一个端点
跳长链的时候注意判断是否需要换根为原来直径的另一个端点就好了
容易发现这样换根以后长剖的结构不会改变
于是只需要lct上打个反转标记就好了
标签:mat test 分析 另一个 并且 修改 单调队列 原来 复杂
原文地址:https://www.cnblogs.com/deaf/p/13390432.html