Exchange-Argument小总结

Exchange-Argument

  • 参考资料:2022 集训队论文《浅谈一类基于交换的贪心在信息学竞赛中的应用》

  • 本文主要介绍树上形式。

一般形式

你需要为 \(n\) 个元素安排一个排名,得到一个序列 \(a\),最小化某函数 \(F(a)\)

如果存在一个满足传递性和强完全性的关系 \(\le\),满足 \(a,b\) 均为元素, $ ab,F(s_1+a+b+s_2)F(s_1+b+a+s_2)$,则按照 \(\le\) 排序后的排名可以最小化 \(F(a)\)

典例为 NOIP2012 国王游戏。

我们在这里略去证明,详见参考资料。

  • 强完全性指 \(\forall a,b, a\le b\bigvee b\le a\),显然满足强完全性一定满足自反性。
  • 条件中 \(\{s_1+a+b+s_2\}\) 为全集。

树上问题

例题

给定一棵树,需要为树的每个节点安排排名 \(p_u\),父节点的排名需要低于子节点。每个点有一个价值 \(c_i\),需要最小化 \(\sum c_u\times p_u\)

分析与结论

唯一的变化是,对于原问题元素的比较 \(\le\),拓展到了对于子序列的比较,即 \(a,b\) 为原来元素的一个序列。

以下是一个重要结论

考虑一个元素 \(v\),我们希望说明如果它的父亲 \(u\)\(u>v\),那么 \(v\) 一定在 \(u\) 之后立刻被选择,此时将 \(v,u\) 合并,可以得到一个规模为 \(n-1\) 的子问题。

考虑证明 \(u\) 被选择后一定会选择 \(v\),对于一个满足树的限制的排列 \(p\),如果 \(u,v\) 不相邻,那么由于 \(v>u\),所以对于序列 \(p_1,p_2\dots u,p_l,p_{l1} \dots p_r,v,\dots,p_n\),一定有 \(u>p_{l,r} \bigvee p_{l,r}>v\),否则 \(v<u\),如果为前者,那么交换 \(u\)\(p_{l,r}\),后者同理,所以 \(v\) 一定紧接着 \(u\) 被选择。

我们可以用以下两种方式解决问题。

方式1

考虑最大的元素 \(v\),显然可以合并它和它的父亲 \(u\),变成一个新的规模更小的问题。

合并的过程可以用并查集维护连通块,注意区分并查集父亲和实际父亲。

使用 priority_queue 或者 set 可以实现加入删除和查询最小值,priority_queue 的方式是同时维护一个代表删除的 priority_queue,实际上 priority_queue 会比 set\(1\) 倍。

注意实现的时候,如果找到了根,那么根其实有可能不在 priority_queue 里面,可删除的 priority_queue 如果删除了不存在的元素是会出问题的,所以一定要特判掉。

复杂度 \(O(n\log n)\)

方式2

我们考虑对每个子树求其答案。

利用分析中的结论,不妨将一棵子树划分成一些必须连续选择的序列,作为树对排列顺序的要求,将这些连续的序列视为一个元素后,我们可以对序列按照正常方式排序得到最优解。

划分序列的过程是对于一棵子树 \(u\),将它的所有儿子的序列拿来排序,尝试将 \(u\) 与最小的序列合并得到新的序列,如果 \(u\) 当前所在的序列较大,由于结论我们知道合并后一定能拿到最优解,否则停止合并,此时 \(u\) 所在序列的权值最小,一定会被最先选择,其中 \(u\) 又一定会被第一个选择。

容易发现合并的过程一定不会改变子树内的选择顺序。

合并时采用启发式合并,利用 setpriority_queue 维护当前子树序列,复杂度为 \(O(n\log^2n)\),但优势在于可以求出所有子树的答案。

当然可以使用可并堆达到 \(O(n\log n)\)

注意到其实一遍 dfs 就可以解决问题,因为启发式合并复杂度保证的来源是合并一次的复杂度为 \(O(\min(|u|,|v|))\),所以并不需要提前计算子树大小,直接合并即可,setpriority_queueswap 操作是 \(O(1)\) 的。

碎碎念

Exc-Arg 除了直接解决问题外,也可以用来简化问题,将选择元素并重排的问题变为排序后选择子序列的问题。

对于树上的情况,我还没有见到过相关的问题。