省选模拟34

A.

  考虑贪心,首先如果某个位置的权值小于0,并且前面能够抵消掉,那么他就不会对前面产生影响。

  所以说,从后向前扫一遍,将负权值塞入堆中,用大根堆维护当前是否可以删掉堆顶元素。

  最后将询问离线,扫一遍即可。

B.

  似乎是个乱搞题?

  我的做法是,对于每种权值,维护当前能够加入联通块的所有点,再维护每种权值当前在联通块中的所有叶子节点,如果加入所有能加入的点之后点的个数>k,那么删掉一些叶子节点。

  之后,再加入当前权值的所有节点。

  对于叶子节点的维护,维护度数简单维护即可。

C.

  可以发现,这个玩意的答案就是虚树的边权和减去虚树的直径。

  对于虚树的边权和,有个结论:将所有节点按照dfs序排序,那么边权和就是相邻两个点之间的距离和,证明的话,感性理解一下,似乎挺显然的?所以这一部分直接用set维护一下就好了。

  动态维护虚树的直径,首先合并两个子树的直径时,新树的直径大小只有6种情况,分类讨论即可。

  所以说这道题可以用线段树来实现这个合并的过程。

原文地址:https://www.cnblogs.com/hzoi-cbx/p/12386501.html