T1
假如max(a)<0的话直接把所有的a排个序贪心选择大的尽量多
现在考虑一个正的ai对后面的影响
维护一个大根堆,a<0就往里添,a>=0就去抵消堆顶元素
这样新序列(堆里的元素)就可以像刚才那样做了
T2
先把点按权值从大到小排序
然后枚举那个点可以选也可以不选
前面的都已经选了
然后在当前枚举的颜色中优先选择那些到根的路径上权值合法的
更新答案
因为如果要是想往小枚举的话一定要选择完当前颜色
所以把当且颜色全部连到根上后还需要额外的考虑中间小于当且权值的点
就是一个递归模拟
最后k的处理也比较简单
更新答案的时候如果连接这个前是小于k连接后大于k那么答案就是k
否则正常更新
T3
发现假如选好S,T后答案一定是这条链上选一次
其他关键点到链的链上选两次
所以现在的问题是维护虚树的直径和权值和
做出dfs序后权值和就是相邻两点之间的距离
再加上首和尾之间的距离
直径可以维护S,T
加入一个点时用(S,x)和(T,x)更新答案
删除不是很好办,用线段树分治解决即可
复杂度O(nloglog)
一个log的解法仍在学习
原文地址:https://www.cnblogs.com/AthosD/p/12386387.html
时间: 2024-11-06 09:55:01