题意
给出长度为 N 的正整数数列 A={a1,⋯,aN},定义一次操作如下:
- 选择一个 {1,⋯,N} 的排列 P={p1,⋯,pN},更新 A←{a1+p1,⋯,an+pn}
判断是否可以通过不超过 104 次上述操作,使得操作后的 A 中每一项都相同。
数据范围:2⩽N⩽50,1⩽ai⩽50。
思路
错误的思路二分结果
开始想的是通过二分最终数列 A 中的相同的元素 a∗,然后判断新的数列 bi=∣ai−a∗∣,是否可以通过排列的求和得到,但是这样构造排列非常困难,无法实现。
题解的直接构造
直接考虑最终状态满足的性质,设 A 中初始全部元素之和为 S=∑i=1Nai,由于每次增加一个排列,总和增加 2N(N+1),所以最终的求和一定是以下总和中的一个
S, S+2N(N+1), S+2N(N+1)⋅2,⋯
由于最终可以表示为 N 个相同元素求和,不妨令这个元素是 a∗,于是 ∃m,使得 N∣(S+2N(N+1))⋅m,不难发现,左式等价于 N∣S 或 N∣(S+2N(N+1))(因为当 m⩾2 时,右侧加的元素中必有 N(N+1) 可消去)
所以有解的充分条件为 N∣S 或 N∣(S+2N(N+1))。
下面考虑如何构造出答案,并因此说明上述的条件是有解的充要条件。考虑一种最简单的数列变换,
P1={2,1,3,4⋯,N},P2={N,N−1,N−2,N−3,⋯,1}
于是将 P1 和 P2 加在 A 上,结果是
{a1+N+2,a2+N,a3+N+1,a4+N+1,⋯,aN+N+1}
考虑与原串的变换量,并以 N+1 作为中心轴,则 N+1+{1,−1,0,0,⋯,0},
所以可以通过上述两个串将 a1←a1+1,并 a2←a2−1。
再考虑最终元素 a∗,如果每次只看差值,其实数列的总和一直没有变换,如果 N∣S,则 a∗=mean(A)=S/N=N1∑i=1Nai;如果 N∣(S+2N(N+1)),则可以先将 P={1,2,⋯,N} 作用在 A 上,从而转换为第一种形式。
我们只需要考虑每次将所有小于 a∗ 的 +1,所有大于 a∗ 的 −1。假设不同时存在一个大于 a∗ 和一个小于 a∗ 的元素,则与 a∗ 是 A 的均值矛盾,所以一定存在一种方法使得每次选择两个元素进行 +1 和 −1 操作,使得最后 A 全部变为 a∗。
代码实现上,先判断是否需要补充一个排列,再求出 a∗ 并分别保存大于和小于 a∗ 的 ai,最后每次从大于的集合和小于的集合中各取一个,输出对应的两个排列。
点击显/隐代码