首页 > 其他 > 详细

省选模拟34

时间:2020-02-29 23:05:19      阅读:79      评论:0      收藏:0      [点我收藏+]

A.

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

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

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

B.

  似乎是个乱搞题?

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

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

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

C.

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

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

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

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

省选模拟34

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!