XYD 给树染色

很好的树上贪心

会这个了好多树上贪心就感觉会简单些

如果一个点是所有点中权值最大的,那么他就会在父亲被取到的时候在下一个取。所以我们可以将它与父亲合并,权值为里面所有权值的平均。应为里面的都是连续取的,所以会占用连续的一段时间取将里面的全部取到。然后就按上面的一直合并就可以了。如果要算答案的话,我们在其中非常不好算,必须等到根节点才能算。如果要做到\(O(n \log n)\)的话我们可以使用平衡树来实现。我们每个节点一开始是一颗树。如果将y并到x上,就将y整体加上siz[x],然后直接merge,不会破坏性质。然而我一开始觉得这题也是和种树一样,权值大的先种。我们使用邻项交换法,时间紧的先种,时间宽的后种,这是对的条件是因为先种这个即使影响到了后面导致后面不能取,也会导致前面不能取,这个真是易证了。但在这题我们不能用的原因是在使用邻项交换法的时候,忽略了先选这个数对其它数是否有贡献,并且可以构造一条链上全是1,最后很大,另一条链全是次大,这样就可以卡掉了。

或者换一种思考方式,就是将邻项交换变成在一个状态取完之后,通过交换邻项可能导致答案更优,这样理解的话种下一些树之后,我们交换一些种树顺序不会对后面产生影响,而可能让答案更优的方式是让紧的先种,时间宽的后种。想一下就可以想通了。

至此,种树就有另一种思路了。对于全局最紧的节点,我们在取到其父节点时会立即取它,所以我们将其与父亲集合合并,其时间就是其时间减掉siz[fa],如果到根节点时就不合法了,那么就是false了。这里直接并查集就可以了,因为贡献非常好算,所以单纯并查集就可以了。

posted @ 2024-07-25 18:58  wuhupai  阅读(2)  评论(0编辑  收藏  举报