ARC159 - AtCoder Regular Contest 159

C. Permutation Addition

题意

给出长度为 NN 的正整数数列 A={a1,,aN}A = \{a_1,\cdots,a_N\},定义一次操作如下:

  • 选择一个 {1,,N}\{1,\cdots,N\} 的排列 P={p1,,pN}P = \{p_1,\cdots,p_N\},更新 A{a1+p1,,an+pn}A\gets \{a_1+p_1,\cdots,a_n+p_n\}

判断是否可以通过不超过 10410^4 次上述操作,使得操作后的 AA 中每一项都相同。

数据范围:2N50,1ai502\leqslant N\leqslant 50, 1\leqslant a_i\leqslant 50

思路

错误的思路二分结果

开始想的是通过二分最终数列 AA 中的相同的元素 aa^*,然后判断新的数列 bi=aiab_i = |a_i - a^*|,是否可以通过排列的求和得到,但是这样构造排列非常困难,无法实现。

题解的直接构造

直接考虑最终状态满足的性质,设 AA 中初始全部元素之和为 S=i=1NaiS = \sum_{i=1}^Na_i,由于每次增加一个排列,总和增加 N(N+1)2\frac{N(N+1)}{2},所以最终的求和一定是以下总和中的一个

S, S+N(N+1)2, S+N(N+1)22,S,\ S + \frac{N(N+1)}{2},\ S + \frac{N(N+1)}{2}\cdot 2,\cdots

由于最终可以表示为 NN 个相同元素求和,不妨令这个元素是 aa^*,于是 m\exists m,使得 N(S+N(N+1)2)mN |(S + \frac{N(N+1)}{2})\cdot m,不难发现,左式等价于 NSN | SN(S+N(N+1)2)N |( S + \frac{N(N+1)}{2})(因为当 m2m\geqslant 2 时,右侧加的元素中必有 N(N+1)N(N+1) 可消去)

所以有解的充分条件为 NSN | SN(S+N(N+1)2)N | (S+ \frac{N(N+1)}{2})

下面考虑如何构造出答案,并因此说明上述的条件是有解的充要条件。考虑一种最简单的数列变换,

P1={2,1,3,4,N},P2={N,N1,N2,N3,,1}P_1 = \{2,1,3,4\cdots,N\},\\ P_2 = \{N, N-1, N-2, N-3, \cdots,1\}

于是将 P1P_1P2P_2 加在 AA 上,结果是

{a1+N+2,a2+N,a3+N+1,a4+N+1,,aN+N+1}\{a_1+N+2, a_2+N, a_3+N+1,a_4+N+1,\cdots,a_N+N+1\}

考虑与原串的变换量,并以 N+1N+1 作为中心轴,则 N+1+{1,1,0,0,,0}N+1 + \{1, -1, 0, 0,\cdots, 0\}
所以可以通过上述两个串将 a1a1+1a_1\gets a_1 + 1,并 a2a21a_2\gets a_2 -1

再考虑最终元素 aa^*,如果每次只看差值,其实数列的总和一直没有变换,如果 NSN | S,则 a=mean(A)=S/N=1Ni=1Naia^* = \text{mean}(A) = S / N = \frac{1}{N}\sum_{i=1}^Na_i;如果 N(S+N(N+1)2)N | (S + \frac{N(N+1)}{2}),则可以先将 P={1,2,,N}P = \{1,2,\cdots,N\} 作用在 AA 上,从而转换为第一种形式。

我们只需要考虑每次将所有小于 aa^*+1+1,所有大于 aa^*1-1。假设不同时存在一个大于 aa^* 和一个小于 aa^* 的元素,则与 aa^*AA 的均值矛盾,所以一定存在一种方法使得每次选择两个元素进行 +1+11-1 操作,使得最后 AA 全部变为 aa^*

代码实现上,先判断是否需要补充一个排列,再求出 aa^* 并分别保存大于和小于 aa^*aia_i,最后每次从大于的集合和小于的集合中各取一个,输出对应的两个排列。


ARC159 - AtCoder Regular Contest 159
https://wty-yy.github.io/posts/35891/
作者
wty
发布于
2023年4月11日
许可协议