CF 1416B. Make Them Equal && F .Sandpile on Clique

题目链接: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:=aixi,aj:=aj+xi. 扯清楚:选择一个下标,这个下标的值减去下标的整数倍,把减去的值加到其他位置上

看完题后很快想到: (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 ia[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+avea[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]%iave这部分数字“释放”出来。
\quad 看了题解后…
\quad 因为所有数开始都是正数,最小为1,从2~n依次遍历,到第 i i i个数时,前 i i i个数的和必然大于等于 i − 1 i-1 i1也就必然大于等于 i − a [ i ] % i i-a[i]\%i ia[i]%i…,这样就可以把所有数彻底“压榨”给a[1]

【2022ICPC澳门站 F. Sandpile on Clique】
赛时也是一直卡着“某个 a [ i ] a[i] a[i]可能数字比较大,但是它必须有其它数加给它到(i-1)才能把自己的数字释放”这一点上出不来。当时就有想固定某个点不释放,其它数字都释放( % ( i − 1 ) \%(i-1) %(i1)) ,然后这个点才全部释放看能不能更新。但是其它 n − 1 n-1 n1个点之间又相互影响。然后想固定一半的点不释放…;然后用堆维护最大值每次释放最大值啥的当时也想过,有个队友也提了句“不会是堆吧”,但又想了下这样更新就挺麻烦的,最后要输出所有数的值,也不知怎么判Recurrent就弃了。(然而正解还真是用堆维护*** 1 0 6 10^6 106次操作后还能更新Recurrent)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值