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\) 即可

code

posted @ 2022-08-10 11:15  401rk8  阅读(34)  评论(0编辑  收藏  举报