CF2077 C Binary Subsequence Value Sum

题目大意:

给定 \(n\) 和一个长度为 \(n\)\(1\) 字符串 \(s\)
\(f_{s, l, r} = (r - l + 1) - 2 \times zero\),其中 \(zero\) 表示 \(s\) 中对应区间的 \(1\) 的个数。
\(F_{s, l, r} = \max_{j = l}^{r} f_{s, l, j} \times f_{s, j + 1, r}\)
\(q\) 次询问,每次询问翻转 \(s\) 的一个位置,求每次翻转位置之后的 \(s\) 的所有子序列的 \(F\) 之和。
答案对 \(10^9 + 7\) 取模。
\(n, q \le 2 \times 10^5\)

解题思路:

\(1\) 的权值设为 \(1\)\(0\) 的权值设为 \(-1\),这样就可以将 \(f\) 转化成前缀和的形式了。
那么就有 \(f_{s, l, r} = sum_{r} - sum_{l - 1}\)
\(F_{s, l, r} = \max_{j = l}^{r} (sum_{j} - sum_{l - 1}) \times (sum_{r} - sum_{j})\)

\(L = l - 1, R = r\),那么

\[\max_{j = l}^{r} (sum_{j} - sum_{L}) \times (sum_{R} - sum_{j}) \]

因为 \(sum_{R} - sum_{j} + sum_{j} - sum_{L}\) 的值固定,且由于 \(0,1\) 的权值为 \(1,-1\)
那么 \(sum_{j} - sum_{L}\) 肯定全局上下界之间每个值都能取到。

那么有个结论:就是 \(x + y = z\) 的条件下,\(xy\) 最大值为 \(\lfloor \frac{z}{2} \rfloor \times \lceil \frac{z}{2} \rceil\)
带进此题就是:

\[F_{l, r} = \lfloor \frac{sum_{r} - sum_{l - 1}}{2} \rfloor \times \lceil \frac{sum_{r} - sum_{l - 1}}{2} \rceil \]

\(sum_{r} - sum_{l - 1}\) 是偶数
那么

\[F_{l, r} = \frac{(sum_{r} - sum_{l - 1})^2}{4} \]

\(sum_{r} - sum_{l - 1}\) 是奇数
那么

\[F_{l, r} = \frac{sum_{r} - sum_{l - 1} - 1}{2} \times \frac{sum_{r} - sum_{l - 1} + 1}{2} \]

\[F_{l, r} = \frac{(sum_{r} - sum_{l - 1})^2}{4} - \frac{1}{4} \]

那么设子序列中 \(0/1\) 的出现次数为 \(cnt_{0/1}\),那么答案就是:

\[(cnt_{1} - cnt_{0}) ^ 2 = cnt_{0}^2 + cnt_{1}^2 - 2 \times cnt_{0} \times cnt_{1} \]

分别计算 \(cnt_{0}^2\)\(2 \times cnt_{0} \times cnt_{1}\)
\(tot_{0/1}\) 表示整串的 \(0/1\) 个数。

$cnt_{0}^2: $

枚举 \(0\) 在子序列中出现的次数,\(1\) 的个数任意:

\[2^{tot_{1}} \sum_{i = 0}^{tot_{0}} i^2 \times C_{tot_{0}}^i \]

后面的式子是 \(O(n)\) 的,不可接受。
那么考虑优化:
\(i^2\) 看为 \((1 + 1 + \dots + 1)^2\),然后拆开就有 \(i \times 1^2 + 2 \times \frac{(i \times (i - 1))}{2}\)

前面的带到式子里就是 \(\sum_{i = 0}^{tot_{0}} i \times C_{tot_{0}}^i\),相当于每个点的权值为 \(1\),然后要求所有集合所包含的点的权值之和。
每个点都会被包含在 \(2^{n - 1}\) 个集合里,加起来就是 \(n \times 2^{n - 1}\)

后面的是每一对点都有 \(2\) 的贡献,总共有 \(\frac{n \times (n - 1)}{2}\) 对点。
每对点包含他的集合个数为 \(2^{n - 2}\)
总贡献就是 \(2^{n - 2} \times n \times (n - 1)\)
加上 \(2^{n - 1} \times n\),得:\(2^{n - 2} \times n \times (n + 1)\)

\(2 \times cnt_{0} \times cnt_{1}\)

枚举 \(cnt_{0}\)\(cnt_{1}\),式子为:

\[2 \times \sum_{i = 0}^{tot_{0}} \sum_{j = 0}^{tot_{1}} C_{tot_{0}}^{i} \times C_{tot_{1}}^{j} \times i \times j \]

拆开:

\[2 \times \sum_{i = 0}^{tot_{0}} C_{tot_{0}}^i \times i \times \sum_{j = 0}^{tot_{1}} C_{tot_{1}}^j \times j \]

所以两边同上:
\(2 \times 2^{tot_{0} - 1} \times tot_{0} \times 2^{tot{1} - 1} \times tot_{1}\)

综上所述,我们可以在 \(O(n + q)\) 的时间复杂度内算出答案。
\(cnt_{0/1}\) 可以在 \(O(1)\) 的变化算出。

总结:

感觉这个题还是有些厉害的地方的。

  1. 通过刻画 \(F\) 的 max,通过观察 \(f_{l,x} + f_{x + 1, r} = f_{l,r}\) 将式子简化成两数相乘的式子。
  2. 上取整/下取整不容易直接枚举,所以合并成平方的形式。
  3. 组合意义,将集合大小之和转化成每个位置对答案的贡献。
posted @ 2025-04-29 23:29  positive_deviation  阅读(18)  评论(0)    收藏  举报