AGC001
https://atcoder.jp/contests/agc001/
F - Wide Swap
考虑 \(p\) 的逆置换 \(q\),可以把问题变成如下形式:
如果 \(|q_{i}-q_{i+1}|\ge k\) 就可以交换 \(q_{i},q_{i+1}\),最小化 \(q\) 逆排列的字典序
显然对于 \(|q_{i}-q_{j}|<k\) 的 \(q_{i},q_{j}\),其相对位置是不会变化的
事实上这也是充分条件。考虑满足该条件的两个排列 \(a,b\),记逆序对数为 \(a\) 中 \(i\) 在 \(j\) 前、\(b\) 中 \(j\) 在 \(i\) 前的 \((i,j)\) 个数。如果 \(a\ne b\),那么必然可以找到一个相邻的逆序对,交换后逆序对数 \(-1\),最终一定会变成 \(0\)。由于 \(a,b\) 都满足条件,因此交换一定是合法的
然后只要求一个满足条件的、逆排列字典序最小的 \(q\)。有两种做法
拓扑排序
回到原序列,问题变为
对于 \(|i-j|<k\) 的 \(i,j\),给定 \(p_{i},p_{j}\) 的相对大小。最小化 \(p\) 的字典序
用小于关系连边后就变成了《菜肴制作》(求反图最大拓扑序),但边数高达 \(n^2\)
\(i\) 入度为 \(0\iff p_{i}=\max_{j\in(i-k,i+k)}\{p_{j}\}\),删除 \(i\) 后只有 \((i-k,i),(i,i+k)\) 中的最大值的入度可能减为 \(0\),线段树维护一下即可
归并
相当于最大化 \(q\) 反串的字典序。贪心,如果 \(q_{i}-q_{i+1}\ge k\) 就交换 \(q_{i},q_{i+1}\),不会严格证明(据此可以证明该题中最小化 \(q\) 字典序也对)
暴力是 \(O(n^{2})\) 冒泡。考虑归并,右边的数能放在当前位置当且仅当它 \(+k\le\) 左边剩下的数,预处理左边数的后缀 \(\min\) 即可