cf1188e-solution

CF1188E Solution

link

考虑 \(x_i\) 表示最后序列中每个数被操作的次数。显然我们可以假设 \(\min\{x_i\}=0\)

仍然显然的是这样子的 \(x\) 序列与最后得到的序列一一对应,也就是说每个最终序列可以只能由一种 \(x\) 得到。

那么就变成计数合法的 \(x\) 序列了。考虑 \(x_i\) 需要满足什么条件?

由于我们有 \(>0\) 的条件,需要满足 \(a_i-s+x_in\ge0\)\(s\) 是操作总数。即

\[x_i\ge\left\lceil\frac{max(0,s-a_i)}{n}\right\rceil(*) \]

当然还没完,这只是保证了 \(s\) 次操作之后非负,我们还要保证前 \(s-1\) 次操作非负。

考虑去掉最后一次操作,由于原条件 \((*)\) 满足,去掉这次操作也一定满足条件 \((*)\) 。我们只需要判断:

  • \(s-1\) 次操作是否合法。

  • 是否存在 \(x\) 使得每个 \(x_i\) 满足条件 \((*)\)

第二点等价于 \(x_i\) 的和大于右边那个柿子的和,即

\[s\ge\sum_i\left\lceil\frac{max(0,s-a_i)}{n}\right\rceil(**) \]

这个柿子与 \(x_i\) 无关。那么我们容易发现,只要上式成立,满足条件 \((*)\) 且和为 \(s\) 的所有 \(x\) 序列都是合法的。

于是我们从小到大枚举 \(s\),维护 \((**)\) 右半部分的值,直到它大于 \(s\),后面的都不合法了。

剩下对 \(x\) 计数,等于求:

  • 有一部分 \(x_i\) 要求大于等于某个值。

  • \(\min\{x_i\}=0\)

  • \(\sum x_i=s\)

\(x\) 序列个数。这个用容斥插板解决一下就好了!

最后复杂度 \(O(\max\{a\})\)

posted @ 2024-02-27 20:26  iorit  阅读(19)  评论(0)    收藏  举报