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\),那么
因为 \(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\)。
带进此题就是:
若 \(sum_{r} - sum_{l - 1}\) 是偶数
那么
若 \(sum_{r} - sum_{l - 1}\) 是奇数
那么
那么设子序列中 \(0/1\) 的出现次数为 \(cnt_{0/1}\),那么答案就是:
分别计算 \(cnt_{0}^2\) 和 \(2 \times cnt_{0} \times cnt_{1}\)。
设 \(tot_{0/1}\) 表示整串的 \(0/1\) 个数。
$cnt_{0}^2: $
枚举 \(0\) 在子序列中出现的次数,\(1\) 的个数任意:
后面的式子是 \(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 2^{tot_{0} - 1} \times tot_{0} \times 2^{tot{1} - 1} \times tot_{1}\)
综上所述,我们可以在 \(O(n + q)\) 的时间复杂度内算出答案。
而 \(cnt_{0/1}\) 可以在 \(O(1)\) 的变化算出。
总结:
感觉这个题还是有些厉害的地方的。
- 通过刻画 \(F\) 的 max,通过观察 \(f_{l,x} + f_{x + 1, r} = f_{l,r}\) 将式子简化成两数相乘的式子。
- 上取整/下取整不容易直接枚举,所以合并成平方的形式。
- 组合意义,将集合大小之和转化成每个位置对答案的贡献。

浙公网安备 33010602011771号