省选模拟34
A.
考虑贪心,首先如果某个位置的权值小于0,并且前面能够抵消掉,那么他就不会对前面产生影响。
所以说,从后向前扫一遍,将负权值塞入堆中,用大根堆维护当前是否可以删掉堆顶元素。
最后将询问离线,扫一遍即可。
B.
似乎是个乱搞题?
我的做法是,对于每种权值,维护当前能够加入联通块的所有点,再维护每种权值当前在联通块中的所有叶子节点,如果加入所有能加入的点之后点的个数>k,那么删掉一些叶子节点。
之后,再加入当前权值的所有节点。
对于叶子节点的维护,维护度数简单维护即可。
C.
可以发现,这个玩意的答案就是虚树的边权和减去虚树的直径。
对于虚树的边权和,有个结论:将所有节点按照dfs序排序,那么边权和就是相邻两个点之间的距离和,证明的话,感性理解一下,似乎挺显然的?所以这一部分直接用set维护一下就好了。
动态维护虚树的直径,首先合并两个子树的直径时,新树的直径大小只有6种情况,分类讨论即可。
所以说这道题可以用线段树来实现这个合并的过程。