[AGC023F] 01 on Tree

题意

给定一棵 \(n\) 个节点的树,每个点都有权值 \(0/1\),每次删除一个没有父亲的节点,并将权值放在序列末尾。

求该序列最小的逆序对数。

Sol

删除不好做,只能 \(\text{dp}\)

考虑把删除改成合并,每次合并 \(x\)\(fa_x\) 表示将 \(x\) 紧接在 \(fa_x\) 后面。

这样维护 \(n\) 个联通块就行。

现在问题变成找到一个排列方式合并,使得答案更优。

给定若干 \(0/1\) 序列,设权值为 \(\frac{cnt1}{cnt0}\),按权值从小到大排列,可以使得逆序对数最小

证明显然,考虑经典的交换贪心即可。

其实这个东西就是构造了一种映射,显然可以发现是不漏的。

这样就把原问题有后效性的操作变成了排列,直接使用上面的结论即可。

最后动态维护权值,并查集即可。

posted @ 2024-08-02 14:56  cxqghzj  阅读(5)  评论(0编辑  收藏  举报