省选模拟34

T1想到暴力贪心,然后猜了一个性质,询问排序继承删掉的点,用线段树优化,肝了好久然后拍伪了。。。最后快读还没有开ll然后爆零。。。
然后一个小时三道题来回看
最后T2有思路,还剩一个小时,疯狂码码码拍拍拍,由于生成的数据K太大过水,以为AC了。。。
T3真的算弃了。。。

T1
对于(a_i<0)的情况,顺序没有影响,排序后贪心。
对于所有情况,可以倒序贪心维护一个大根堆。
如果(a_i>0),那么用(a_i)去不断抵消堆顶
否则圧堆。
最后弹堆得到负数序列,和(a_i<0)同理

T2
这个有点像模拟题。
(a)从大到小排序,那么最终的点一定是 (a_i=x)的一部分+(a_i>x)的所有点
以不同权值分段,如果本段可以更新答案,那么本段的点一定把之前段的连通块全部连接,这个判断可以用并查集。
当之前段现在所在连通块的大小<=k时,可以直接更新答案。
>k时要考虑段内的答案的下界,也就是连通之前段的最少总点数,这个可以暴力dfs,容易知道只会计算一次。
注意要特判第一段。

T3
考虑起点和终点,可以推出答案是2*边权和-直径
点集的生成树的二倍边权和有个结论,为排序后相邻两两dis+首尾dis,可以画图理解下
动态直径求法很多,可以线段树分治、线段树维护括号序列(进为(,出为),答案为max(dfs序上消不掉的括号间距离和))、dfs序上线段树维护直径端点合并
我写的最后一个,每个节点存区间内存在的直径的两个端点,合并从子区间4个点中选最长路径。
用欧拉序求(lca),可以做到(O(nlogn))

原文地址:https://www.cnblogs.com/hzoi-yzh/p/12386621.html