AGC001F Wide Swap
题意 : 给出一个长度为
当
求通过若干次上述操作能得到的字典序最小的排列。
考虑
对于一对
于是,若
这张有向图的每种拓扑序都是一个能够造出的排列。
逆排列和原排列的字典序关系比较复杂,我们不妨直接在原排列上建图。
对于一对
若要求
这张有向图的每种拓扑序都是一个能够造出的排列。现在要使得
兔队告诉我们,直接在拓扑排序的同时贪心取编号最小的点扩展是错的,应该使用下面的算法 :
建立反图,在反图上拓扑排序,并从
该算法的正确性依赖于“字典拓扑原理”:
感谢 yhx 的指导
对于任意一个
和 的一个拓扑序 : 是字典序最大的,当且仅当 是字典序最大的。 (若将“大”改为“小”,则命题不一定成立)
在第一个算法中,我们每次贪心地取编号最小的点,即使得
在第二个算法中,我们将图的边集翻转,问题变为求出字典序最大的
本题中,DAG 的边数达到
点
用大根堆维护目前入度为
使用线段树维护区间最大值,当删除点
复杂度