20261102-drj 杂题选讲
P17493 [ICPC 2026 Wuhan I] Sort
原来的排列没有什么性质,不妨考虑进行第一次操作后的序列。
我们发现序列会分成两个分别递增的序列,手玩一下,之后的操作就是把一部分切出来归并到另一边。不妨在值域上考虑这个问题,令 \(c_x\) 表示数 \(x\) 隶属左半边还是右半边转成 \(01\) 序列。不难发现序列可以被刻画成 \(000\dots 0[1\dots 0]111\dots 1\),如果中间部分没掉了,也就是所有 \(1\) 都在 \(0\) 之后时原序列就有序了。考虑此时一次操作带来的影响:

如果操作在左半区间,对应在值域上就是把最后的几个 \(0\) 变成 \(1\)。
同理,如果操作在右半区间,对应在值域上就是把最后的几个 \(1\) 变成 \(0\)。
由此发现单调性,操作的本质就是 \(01\) 往里缩的过程,因此可以用 dp 解决,在值域上令 \(f_{l,r}\) 表示第一个 \(1\) 的位置在 \(l\),最后一个 \(0\) 的位置在 \(r\) 时,序列有序的期望操作次数。
转移就是枚举是 \(0\) 缩还是 \(1\) 缩,缩掉几个:
直接前缀和优化即可。时间复杂度 \(O(n^3)\)。
P14581 [LNCPC 2025] 海鸥奇遇
调整法构造。
由于鸟、食物、操作次数都相等,每次操作必须让一个鸟匹配上一个食物。每个鸟只能与初始局面中四个方向上的第一个食物匹配,于是鸟向食物连边可以得到一个点数边数都是 \(O(n)\) 的二分图,我们就是要找到一组二分图的完美匹配,使得存在一种操作顺序保证每只鸟都能准确吃掉食物。
不妨假设我们已经找到了这样一组匹配,考虑这对操作顺序带来的限制,就是每只鸟到他要吃的食物之间的所有鸟都要晚于这只鸟起飞,于是每只鸟向这些鸟连边,容易发现,每个点在一个方向上至多被匹配边跨越一次,也就是说每个点的入度至多只有 \(4\),这样建图得到的图 \(G\) 仍然是点数边数均为 \(O(n)\) 的。如果 \(G\) 中无环,说明这组匹配就是可行的,图的拓扑序就是一组可行解,否则导出了矛盾,说明方案不可行。
问题在于我们只能用流 / 匈牙利算法得到这个二分图的一组完美匹配,无法保证其合法性。考虑调整法,假设出现了一组环:

我们发现,只需要将每个红点的匹配点循环移位一位就可以把这个环解掉,设原来环上点的匹配点分别为 \([C_1,C_2,\dots,C_k]\),将其调整为 \([C_k,C_1,C_2,\dots,C_{k-1}]\)。考虑证明其正确性,对于环上相邻点 \(u,v\),存在边 \(u\to v\) 的意义就是有食物 \(w\) 使得 \(u,v\) 同时可达,那么把 \(v\) 的匹配点调整为 \(w\) 是可行的,这样 \(u\) 失配了再沿着环往前调整即可。因此调整之后仍然满足完美匹配,并且把环解掉了。因此直接暴力重复这个过程:找环、把环上点的匹配点循环移位,重新建图并重复上述过程直到不存在环。这样消环的过程只会进行 \(O(n)\) 次,因此总时间复杂度 \(O(n^2)\)。
QOJ.23130 Orientation of a Graph
增量法构造。构造先从大局开始思考。
如果 \(n\) 为奇数,每个点都可以做到入度与出度相等,随便构造,比如在环上每个点向后面的点连边。
否则 \(n\) 为偶数。初步观察是 \(\mathrm{in}+\mathrm{out}=n-1\) 为奇数,那么 \(\mathrm{in}-\mathrm{out}\) 也是奇数,因此 \(d\) 为奇数无解。
然后是一个比较神的观察,若 \(n<2d\) 则无解。感性理解就是 \(d\) 太大时没办法错出这么大的度数差。证明:此时每个点的度数只能是 \(+d,-d\)。记 \(+d,-d\) 的点集分别为 \(P,N\),由于点度之和为 \(0\),集合一定对半分,有 \(|P|=|N|=n/2\)。此时 \(P\) 内部点的度数差之和为 \(|P|\cdot d\),而这个度数差只能由 \(N\leadsto P\) 的边带来,上界就是 \(|P|\cdot |N|\),由于 \(d>n/2\),\(|P|\cdot d>|P|\cdot |N|\),矛盾,因此无解。
剩下的情况就是 \(n\) 为偶数,\(d\) 为奇数,且 \(n\ge 2d\)。我们声称此时一定有解。还是从边界开始分析,考虑 \(n=2d\) 怎么做,直接对半分成 \(n/2,n/2\),由于两边都是奇数可以用奇数的方法构造,中间对着连就行了。
考虑增量,假设规模为 \(m\) 的已经解决。加入一个点不好处理,那就加两个点记为 \(u,v\),先连上 \(u\to v\)。不难想到分为 \(k,m-k\) 来调平,\(k\) 个点向 \(u\) 连边被 \(v\) 连边,\(m-k\) 个点向 \(v\) 连边被 \(u\) 连边,此时 \(\mathrm{deg}_u=2k-m-1,\mathrm{deg}_v=m-2k+1\),令 \(2k-m-1=d\) 解得 \(k=\frac{m+d+1}{2}\)。于是处理了 \(m\to m+2\) 的增量,做完了。

浙公网安备 33010602011771号