搞出平均数 v,相当于每个数都得是 v,将 ai−v→ai,则变成每个数都得为 0,且 ai≥−v。
一个区间能均摊,当且仅当区间和为 0。
考虑最小步数,发现上界是 ⌈k−1len−1⌉ 次。
证明考虑从左往右前 k 个位置。如果我们至少有前缀的和 ≥0,则可以将剩余的数放到第 k 堆,然后按归纳法继续进行。如果我们前缀和 <0,则先解决右边的子问题,再解决左边的子问题,相当于每次踢掉 k−1 个数。
考虑这个上取整好像可以贪心,设两个区间的余数分别为 r1,r2,考虑合并的变化:
⌈k−1r1⌉+⌈k−1r2⌉→⌈k−1r1+r2+1⌉
有 r1,r2∈[0,k−1),r1+r2+1∈[1,2k−3],所以 ⌈k−1r1+r2+1⌉∈[1,2],分类讨论:
由其他题解可知,当余数 mod(k−1)=0 时,合并不劣,所以最后答案的形态一定是几段长度减一 mod(k−1)=0 且和为 0 的区间拼在一起。
答案为:∑⌈k−1len−1⌉=k−1n−∑k−11,我们要贪心选取尽量多的合法区间。
再发现 ⌈k−1len−1⌉ 的上界非常紧,所以我们至多可以这么多次取到环上的所有点,而不被断开。
断环成链,复制一遍。对每个点,找到其后面最小的合法点,倍增跳就行了。
输出方案直接在倍增里找。