[AGC001F] Wide Swap 题解
有点激动。
题意
给出一个元素集合为 \(\{1,2,\dots,N\}\) \((1\leq N\leq 500,000)\) 的排列 \(P\),当有 \(i,j\) \((1\leq i<j\leq N)\) 满足 \(j-i\geq K\) \((1\leq K\leq N-1)\) 且 \(|P_{i}-P_{j}|=1\)时,可以交换 \(P_{i}\) 和 \(P_{j}\)。
求:可能排列中字典序最小的排列。
\(n\le5\times10^5\)。
推导
值域的限制难以处理,令 \(B_{P_i}=i\),那么条件转化过来,就是位置相邻,且值相差大于等于 \(K\),即可交换。
这个 \(B_i\) 表示的是第 \(i\) 的位置,那么 \(P_i\) 字典序最小正价于 \(B_i\) 字典序最小。
比较暴力的想法就是每次找最小的数的位置暴力向左跳,复杂度为 \(O(n^2)\)。
我们发现如果这个数往左跳不过去有两种情况,一种是左边的数要小于这个数,第二种是有 \(k\) 的限制,显然这两种限制都是针对全局的,也就是说如果这个子区间他的顺序确定了,那么在全局中他的顺序也不会改变。
这里可以归并排序。
左右的子区间顺序都是一定的。因为你把左边的数插到右边 \(x\) 的位置,右边 \(x\) 前面的数对其有 \(k\) 的限制,所以我们从整个区间的最右边加入。
插入优先考虑 \(k\) 的限制,这是硬性的,如果左边不能插进去这个位置,就加入当前右区间的最右边,或者你当前左边的数要小于右边的数,也调整右区间,否则加入左区间最右边的数。
判断是否被 \(k\) 限制还需要树状数组,所以时间复杂度加两只 \(\log\)。

浙公网安备 33010602011771号