CF1237G

搞出平均数 vv,相当于每个数都得是 vv,将 aivaia_i-v\to a_i,则变成每个数都得为 00,且 aiva_i \ge -v

一个区间能均摊,当且仅当区间和为 00

考虑最小步数,发现上界是 len1k1\lceil\frac{len-1}{k-1}\rceil 次。

证明考虑从左往右前 kk 个位置。如果我们至少有前缀的和 0\ge 0,则可以将剩余的数放到第 kk 堆,然后按归纳法继续进行。如果我们前缀和 <0<0,则先解决右边的子问题,再解决左边的子问题,相当于每次踢掉 k1k-1 个数。

考虑这个上取整好像可以贪心,设两个区间的余数分别为 r1,r2r1,r2,考虑合并的变化:

r1k1+r2k1r1+r2+1k1\lceil \frac{r1}{k-1}\rceil+\lceil \frac{r2}{k-1}\rceil\to \lceil\frac{r1 + r2 + 1}{k-1}\rceil

r1,r2[0,k1)r1,r2\in [0,k-1)r1+r2+1[1,2k3]r1+r2+1\in[1,2k-3],所以 r1+r2+1k1[1,2]\lceil\frac{r1+r2+1}{k-1}\rceil\in[1,2],分类讨论:

由其他题解可知,当余数 mod(k1)0\bmod (k-1)\ne 0 时,合并不劣,所以最后答案的形态一定是几段长度减一 mod(k1)=0\bmod (k-1)=0 且和为 00 的区间拼在一起。

答案为:len1k1=nk11k1\sum\lceil\frac{len-1}{k-1}\rceil=\frac{n}{k-1}-\sum\frac{1}{k-1},我们要贪心选取尽量多的合法区间。

再发现 len1k1\lceil\frac{len-1}{k-1}\rceil 的上界非常紧,所以我们至多可以这么多次取到环上的所有点,而不被断开。

断环成链,复制一遍。对每个点,找到其后面最小的合法点,倍增跳就行了。

输出方案直接在倍增里找。

posted @ 2023-11-05 12:02  蒟蒻orz  阅读(8)  评论(0编辑  收藏  举报  来源