省选构造专题
省选构造专题
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)\)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步