省选构造专题

省选构造专题

The same permutation

首先打个表,发现在 \(1\le n\le 5\) 之内的是否有合法方案的情况为 √××√√ 大了打不出来了

考虑一下 \(4,5\) 连续有解,注意到一个偶数有解,则这个偶数 \(+1\) 也必定有解。

考虑以下构造方法

即对于某一个交换,可以在它前后各添加一个右端点相同的交换,添加前后结果是等价的。

回到上面那个结论,对于新增的点,考虑新增的交换,总共只有偶数个,所以可以在 \((1,2),(3,4),(5,6)\dots (i,i+1)\) 前后进行这个操作。

考虑继续扩展上述结论。

对于一个合法的奇数 \(i\) 发现 \(i+1\) 是否有解似乎不是那么好判断,先跳过,\(i+2\) 也不好判断,也先跳过

发现 \(i+3\) 是可以构造出合法解的,考虑如下构造。

现将 \(i+1,i+2,i+3\) 为右端点 \(1~i-1\) 为左端点通过上述方法处理掉(这是合法的因为 \(i-1\) 是偶数),现在就变为 \(i,i+1,i+2,i+3\)\(4\) 个点 \(\dbinom{4}{2}\) 种交换未处理,这个问题等价于 \(n=4\) 时的构造方案,直接代入即可。

现在合法情况是形如 √××√√??√√??√√??√√... 猜测一下对于 ? 是不可能构造出来的,所以直接写代码

对于 ? 而言确实是无法构造的,考虑证明

有一个结论,每一次交换操作全局逆序对个数的奇偶性会发生变化,考虑证明。首先只用考虑交换的两个数以及它们之间的数的贡献的变化,对于交换的两个数显然 \(|\Delta|=1\),对于中间的数分讨一下它和交换的两个数的大小关系发现 \(|\Delta|=0/2\)证毕

所以只有交换总次数是偶数才会有解,而 \(n \bmod 4 =2/3\)\(\dbinom{n}{2}=\dfrac{n(n-1)}{2}\) 是奇数,所以无解。

证毕

所以考虑以上构造方法,用链表进行维护即可。

时间复杂度 \(O(n^2)\)

[AGC006E] Rotate 3x3

先判断掉一些显然的错误。

可以转化题意变为

给定一个排列 \(a\)\(01\) 序列 \(b\)

可以无限次进行下述操作:

翻转相邻 \(3\) 个元素,并使它们对应的 \(b\) 序列异或上 \(1\)

问是否存在操作使得 \(a\) 序列升序时,\(b\) 序列全为 \(0\)

显然有每个数只能在下标奇或偶上移动,取决于最初的状态。

现在毫无头绪,发现第四个样例模不出来,写个暴力试试。

发现很多有解的操作序列中都有一段很有趣的操作。(描述一个翻转操作时设 \(x\) 为中间的那个数)

即形如 \(x,x+2,x,x+2,x,x+2\),研究一下,发现这种操作不会改变 \(a\) 序列,但会使 \(b_x,b_{x+2}\) 异或上 \(1\)

猜测一下能在不改变 \(a\) 的情况下改变 \(b\) 有意义的操作的只有这一个,所以写个 \(O(n^2)\) 的冒泡排序模拟排序序列 \(a\) ,得到最终的 \(a,b\),然后套用上述操作的结论(即 \(\operatorname{xor}_{2\mid i}b_i=0\)\(\operatorname{xor}_{2\nmid i}b_i=0\) 时有解),交上去发现只有 TLE 没有 WA

考虑用树状数组优化上述做法,交上去发现 AC 了。

思考一下,能得到下述严谨做法。

考虑一个翻转操作,会在不改变奇偶一方 \(b\) 序列异或和的情况下改变另一方的异或和。

这启发我们研究交换次数,而交换次数这个东西又是和逆序对挂钩的(考虑分奇偶后)。

所以可以分别求出奇偶的逆序对,然后套用上述结论 \(\operatorname{xor}_{2\mid i}b_i=0\)\(\operatorname{xor}_{2\nmid i}b_i=0\) 时有解。

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

upd:

注意到我们只关心逆序对个数的奇偶,所以可以套用结论

逆序对奇偶性 = 排列长度 - 置换环数量

证明

交换两个相邻的数会改变逆序对总数的奇偶性,而交换任意两个数也会改变其奇偶性(The same permutation 的结论)

而一个置换环只会交换 \(size-1\) 次,即只需要交换 排列长度 - 置换环数量 次即可升序

而求置换环个数是能做到线性的。

[AGC046E] Permutation Cover

首先手玩能发现结论,记 \(mn=\min_i\{a_i\},mx=\max_i\{a_i\}\),当 \(2mn<mx\) 无解,其余情况有解。

证明
  • \(2mn<mx\) 时无解,由于一个数至多在两个不同的序列中,即最多有 \(2mn\) 个不同的合法序列,显然不能将两个 \(mx\) 对应的元素放在一个序列。

  • 其余情况有解,可以通过上述证明构造,设 \(u\)\(mn\) 对应的元素(若有多个则拼成一段),\(v\)\(mx\) 对应的元素,考虑将序列分为 \(mn\) 组,每组可以这样构造 \(v+u+v\)(前一个 \(v\) 不一定等于后一个 \(v\)),显然合法。

问题转移到如何构造使得字典序最小。

受构造 \(2mn\ge mx\) 时有解的启发,考虑先贪心字典序最优选取直到 \(2mn=mx\) ,在通过上述方法构造,然后贪心调整每一组,再排序后按次拼接,然后发现 fake 了(

发现问题是未能利用好上一部分的答案。

考虑每次枚举下一段长度 \(len,1\le len \le k\) 拼接在原答案后面,发现这样囊括了答案的所有分段方式,所以现在只用考虑如何最优且保证接下来也能合法。

由于后面拼接的长度定了,所以拼接的元素也是定了(由前面 \(k-len\) 对全集取补),考虑对于后面还剩余的元素。

  • \(2mn\ge mx\) 则显然有解。

  • \(2mn+1=mx\) 发现将当前段 \(mx\) 对应的元素(不止一个)放在 \(mn\) 对应的元素前面 (不止一个) 也是有解的。

  • \(2mn+1<mx\) 无解,证明同上。

所以可以根据上述限制拼接成合法的一段,然后取字典序最小即可。

时间复杂度 \(O(k^2\sum a)\)

posted @   Qyun  阅读(33)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示