题目链接:CF 1416B. Make Them Equal
附上一道 “题材” 差不多的:2022ICPC澳门站 F. Sandpile on Clique
【CF 1416B. Make Them Equa】
先把这个东西
a
s
s
i
g
n
a
i
:
=
a
i
−
x
⋅
i
,
a
j
:
=
a
j
+
x
⋅
i
.
assign \quad a_i:=ai−x⋅i, aj:=aj+x⋅i.
assignai:=ai−x⋅i,aj:=aj+x⋅i. 扯清楚:选择一个下标,这个下标的值减去下标的整数倍,把减去的值加到其他位置上
看完题后很快想到: (1) 所有数的和不变,那最后相等的数就是平均数 a v e = s u m / n ave\;=\;sum/n ave=sum/n, s u m % n ! = 0 sum \% n!=0 sum%n!=0必然无解;(2)把所有的值聚集在 a [ 1 ] a[1] a[1]上,因为 1 1 1是最小单位
\quad
脑子一热直接写了,WA5:
\quad
所有数,减去下标的整数倍后给
a
[
1
]
a[1]
a[1]后,变成了
a
[
i
]
%
i
a[i]\;\%\;i
a[i]%i,如果这个数比
a
v
e
ave
ave小再从
1
1
1加回来。但是比
a
v
e
ave
ave大呢?
一种方案是加上
i
−
a
[
i
]
%
i
i-a[i]\%i
i−a[i]%i后把第
i
i
i个数彻底“压榨”给
a
[
1
]
a[1]
a[1],然后
a
[
1
]
a[1]
a[1]还回来
a
v
e
ave
ave,但这样就是 4 次操作; 第二种是
a
[
1
]
a[1]
a[1]先给
a
[
i
]
a[i]
a[i]几个数,使
a
[
i
]
=
i
+
a
v
e
−
a
[
i
]
a[i]\;=\;i+ave-a[i]
a[i]=i+ave−a[i],然后
a
[
i
]
a[i]
a[i]在还回去一个
i
i
i,但是这样,
a
[
1
]
a[1]
a[1]可能不够,即便在我尝试了先进行排序处理后也不行。
\quad
第一种卡次数,第二种就是每次操作后数字不能为负数的限制。难点就在于
a
[
i
]
%
i
>
a
v
e
a[i]\%i>ave
a[i]%i>ave时,怎么把
a
[
i
]
%
i
−
a
v
e
a[i]\%i-ave
a[i]%i−ave这部分数字“释放”出来。
\quad
看了题解后…
\quad
因为所有数开始都是正数,最小为1,从2~n依次遍历,到第
i
i
i个数时,前
i
i
i个数的和必然大于等于
i
−
1
i-1
i−1也就必然大于等于
i
−
a
[
i
]
%
i
i-a[i]\%i
i−a[i]%i…,这样就可以把所有数彻底“压榨”给a[1]
【2022ICPC澳门站 F. Sandpile on Clique】
赛时也是一直卡着“某个
a
[
i
]
a[i]
a[i]可能数字比较大,但是它必须有其它数加给它到(i-1)才能把自己的数字释放”这一点上出不来。当时就有想固定某个点不释放,其它数字都释放(
%
(
i
−
1
)
\%(i-1)
%(i−1)) ,然后这个点才全部释放看能不能更新。但是其它
n
−
1
n-1
n−1个点之间又相互影响。然后想固定一半的点不释放…;然后用堆维护最大值每次释放最大值啥的当时也想过,有个队友也提了句“不会是堆吧”,但又想了下这样更新就挺麻烦的,最后要输出所有数的值,也不知怎么判Recurrent就弃了。(然而正解还真是用堆维护***
1
0
6
10^6
106次操作后还能更新Recurrent)