CF2121G 题解

先做一步转化,把 \(0\) 视作 \(-1\),这样就可以通过比较前缀和的大小来判断 \(0\) 多还是 \(1\) 多。

然后设 \(\Delta_i = \sum \limits_{j = 1}^i s_i\)

那么我们要求的就是:

\[\begin{aligned} \mathrm{Ans} &= \sum_{l = 1}^n \sum_{r = l}^n [\Delta_{l - 1} \le \Delta_r] \cdot c_1(l, r) + [\Delta_{l - 1} > \Delta_r] \cdot c_0(l, r) \\ &= \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot c_1(l + 1, r) + [\Delta_l > \Delta_r] \cdot c_0(l + 1, r) \\ &= \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot c_1(l + 1, r) \right) + \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l > \Delta_r] \cdot c_0(l + 1, r) \right) \\ \end{aligned} \]

其中 \(c_1(l, r)\) 为区间 \([l, r]\)\(1\) 的个数,\(c_0(l, r)\) 则为 \(0\) 的个数。

注意到 \(c_0(l, r), c_1(l, r)\) 是可以只用 \(l, r, \Delta\) 表示的,因为它们满足以下方程组:

\[\begin{cases} c_1(l, r) + c_0(l, r) = r - (l - 1) \\ c_1(l, r) - c_0(l, r) = \Delta_r - \Delta_{l - 1} \end{cases} \]

解得:

\[\begin{cases} c_1(l, r) = \dfrac{(r + \Delta_r) - ((l - 1) + \Delta_{l - 1})}{2} \\ c_0(l, r) = \dfrac{(r - \Delta_r) - ((l - 1) - \Delta_{l - 1})}{2} \\ \end{cases} \]

代入原式:

\[\begin{aligned} \mathrm{Ans} &= \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot c_1(l + 1, r) \right) + \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l > \Delta_r] \cdot c_0(l + 1, r) \right) \\ &= \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot \dfrac{(r + \Delta_r) - (l + \Delta_l)}{2} \right) + \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l > \Delta_r] \cdot \dfrac{(r - \Delta_r) - (l - \Delta_l)}{2} \right) \\ &= \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot ((r + \Delta_r) - (l + \Delta_l)) \right) + \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l > \Delta_r] \cdot ((r - \Delta_r) - (l - \Delta_l)) \right) \\ &= \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot (r + \Delta_r) - [\Delta_l \le \Delta_r] \cdot (l + \Delta_l) \right) + \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l > \Delta_r] \cdot (r - \Delta_r) - [\Delta_l > \Delta_r] \cdot (l - \Delta_l) \right) \\ &= \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot (r + \Delta_r) + [\Delta_l > \Delta_r] \cdot (r - \Delta_r) \right) + \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n -[\Delta_l \le \Delta_r] \cdot (l + \Delta_l) - [\Delta_l > \Delta_r] \cdot (l - \Delta_l) \right) \\ &= \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot (r + \Delta_r) + [\Delta_l > \Delta_r] \cdot (r - \Delta_r) \right) - \dfrac{1}{2} \left( \sum_{l = 0}^{n - 1} \sum_{r = l + 1}^n [\Delta_l \le \Delta_r] \cdot (l + \Delta_l) + [\Delta_l > \Delta_r] \cdot (l - \Delta_l) \right) \\ \end{aligned} \]

如何计算?以第一个括号为例:枚举 \(r\),可以开一个值域线段树维护 \([1, r)\) 中有多少个 \(\Delta_i\),从而快速计算 \(\Delta_l \le \Delta_r\)\(\Delta_l > \Delta_r\) 的数量,分别乘上对应的权值即可。

为什么开的下值域线段树?因为 \(\Delta_i \in [-n, n]\),值域大小只有 \(2n\)

时间复杂度:\(O(n \log n)\)

代码

posted @ 2025-08-02 16:07  David9006  阅读(10)  评论(0)    收藏  举报