CF1188E Solution
考虑 \(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\})\)。
标签:满足条件,max,solution,合法,ge,cf1188e,序列,操作 From: https://www.cnblogs.com/iorit/p/18038000