[AGC023F] 01 on Tree
题意
给定一棵 \(n\) 个节点的树,每个点都有权值 \(0/1\),每次删除一个没有父亲的节点,并将权值放在序列末尾。
求该序列最小的逆序对数。
Sol
删除不好做,只能 \(\text{dp}\)。
考虑把删除改成合并,每次合并 \(x\) 和 \(fa_x\) 表示将 \(x\) 紧接在 \(fa_x\) 后面。
这样维护 \(n\) 个联通块就行。
现在问题变成找到一个排列方式合并,使得答案更优。
给定若干 \(0/1\) 序列,设权值为 \(\frac{cnt1}{cnt0}\),按权值从小到大排列,可以使得逆序对数最小
证明显然,考虑经典的交换贪心即可。
其实这个东西就是构造了一种映射,显然可以发现是不漏的。
这样就把原问题有后效性的操作变成了排列,直接使用上面的结论即可。
最后动态维护权值,并查集即可。