前言:

(虚假的想象学竞赛,实际的数学竞赛)

题意:

给出一个长度为 \(n\) 的二进制序列,我们对于每一个分割点(可以看做在元素与元素之间),其贡献为分割点右边的 \(cnt_1 - cnt_0\) 与左边的 \(cnt_1 - cnt_0\) 乘积,并且定义这个序列的得分为这个序列所有分割点贡献的最大值。

现在希望你求出给定的长度为 \(n\) 的二进制序列的所有子序列的贡献之和(子序列可以不连续,也就是类似于子集的定义)。同时我们有 \(q\) 次询问,每一次都会修改这个二进制序列上的某一个值(使其异或上 \(1\)),对于每一次修改之后都要回答上述的贡献之和。

思路:

显然的,对于一个固定的序列,我们可以 \(O(len)\) 暴力去做,但是很明显非常不优秀,那我们考虑一步一步优化。首先需要明确的是,对于一个固定的序列,其 \(cnt_1 - cnt_0\) 总为一个定值,我们记为 \(p\)。假设任意分割点左边的贡献为 \(a\),右边的为 \(b = (p-a)\)。那么贡献即为:

\[f(a) = a(p-a)=-a^2+p\cdot a
\]

我们需要得到 \(f(a)_{\max},a\in[0,p]\),其实这个地方的定义域是不严谨的,只是这么写方便理解。那么一般来说最值在 \(a=\frac{p}{2}\) 的时候取到,显然这是在定义域之内的。又因为 \(a\) 是整数,所以我们某一个固定序列的得分即为:

\[\lceil\frac{p}{2}\rceil\cdot \lfloor\frac{p}{2}\rfloor
\]

现在考虑如何形式化的表示所有子序列的得分。令 \(x\) 为这个长度为 \(n\) 的序列的 \(cnt_1\) ,\(y\) 为 \(cnt_0\) ,显然 \(x+y=n\) ,给出式子:

\[ans=\frac{1}{4}\sum_{i=0}^{x}\sum_{j=0}^{y}\dbinom{x}{i}\dbinom{y}{j}\left((i-j)^2-[(i-j)\ \&\ 1=1]\right)
\]

其中后面中括号包起来很奇怪的那一坨的意义是判断 \(i-j\) 是否为奇数。想等式比较难,但是我觉得等式都列出来了应该不难理解,至于 \(\frac{1}{4}\) 的由来是两个 \(\frac{i-j}{2}\) 提出去的。

现在好像复杂度还是不够优秀,没事我们有数学牢大的帮助。先不考虑后面判断奇偶的问题,只考虑前面的式子。考虑把完全平方展开,对于 \(i^2\) 和 \(j^2\) 发现形式一样,可以只考虑一种。在给出最终推到之前,需要给出一个重要的等式:

\[\sum_{i=0}^{x}\dbinom{x}{i}\cdot i=x\cdot2^{x-1}
\]

考虑组合意义(双射)证明,右边式子可以看做先在 \(x\) 个里面选择 \(i\) 个,然后在 \(i\) 个里面选择 \(1\) 个。左边可以看做先在 \(x\) 里面选择 \(1\) 个,然后在剩下的里面选择 \(i-1\) 个,可以证明的是,这是双射的。

运用相同的思想,可以得到:

\[\sum_{i=0}^{x}\dbinom{x}{i}\cdot i^2=x\cdot 2^{x-1}+x(x-1)\cdot2^{x-2}
\]

唯一需要的技巧就是把 \(i(i-1)+i\) 分开算。

那么开始暴力简化式子之后就可以得到:

\[ans=\frac{1}{4}\left((x\cdot 2^{n-1}+x(x-1)\cdot 2^{n-2})+(y\cdot 2^{n-1}+y(y-1)\cdot 2^{n-2})-xy\cdot 2^{n-1}\right)
\]

这个式子的推导过程是有趣的,但是太长了,请根据上述前置等式自行推导(对于第一次接触组合推导的组合小白来说,这是具有启发性的)。

然后还需处理一个问题,就是那个判断奇偶性的部分,怎么快速处理。我们这样考虑,假设外层的 \(i\) 一直枚举,很显然,要满足 \(i+j\) 是一个奇数,那么必然有内层的 \(j\) 是一个偶数,反之同理,也就是内层存在的贡献应为:

\[\begin{cases}
\sum_{j\equiv1\pmod 2}^y\dbinom{x}{j},\left(i\equiv0\pmod2\right)\\
\sum_{j\equiv0\pmod 2}^y\dbinom{x}{j},\left(i\equiv1\pmod2\right)
\end{cases}
\]

这个两个式子应该是非常著名的,他们的贡献都为 \(2^{y-1}\),又因为外层的总贡献为 \(2^x\) 所以总贡献就为 \(2^{n-1}\) ,最终答案减去他就好啦,所以:

\[ans=\frac{1}{4}\left((x\cdot 2^{n-1}+x(x-1)\cdot 2^{n-2})+(y\cdot 2^{n-1}+y(y-1)\cdot 2^{n-2})-(xy+1)\cdot 2^{n-1}\right)
\]

然后最后就只剩下单个位置修改的问题了,很简单,修改了之后改变一下 \(cnt_{0/1}\) 的值就好啦。

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define LL long long
inline int read(){
char c=getchar();bool f=0;int x=0;
while(c > '9' || c < '0') f|=c=='-',c=getchar();
while(c >= '0'&&c <= '9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
if(f) x=-x;return x;
}
const int N = 2e5 + 10;
const int MOD = 998244353;
char s[N];
int inv2 = (MOD + 1) / 2,p2[N],n,q;
LL cnt[2]; LL calc(LL x)
{
if(x == 0) return 0;
else if(x == 1) return x * p2[n - x] % MOD * inv2 % MOD * inv2 % MOD;
else return (x * p2[x - 1] + x * (x - 1) % MOD * p2[x - 2]) % MOD * p2[n - x] % MOD * inv2 % MOD * inv2 % MOD;
}
void solve()
{
cnt[0] = cnt[1] = 0;
n = read(),q = read();
scanf("%s",s + 1);
for(int i = 1;i <= n;++i)
++cnt[s[i] - '0']; while(q--)
{
int id = read();
--cnt[s[id] - '0'];
s[id] = '1' - (s[id] - '0');
++cnt[s[id] - '0'];
LL ans = 0;
ans = (calc(cnt[0]) + calc(cnt[1])) % MOD;
ans = ans - (cnt[0] * cnt[1] % MOD * p2[n - 1] % MOD + p2[n - 1] + MOD) * inv2 % MOD * inv2 % MOD;
ans = (ans % MOD + MOD) % MOD;
std::cout << ans << '\n';
}
} int main()
{
int T;
T = read();
p2[0] = 1;
for(int i = 1;i <= N - 10;++i) p2[i] = (p2[i - 1] << 1) % MOD;
while(T--) solve();
return 0;
}

CF2077C Binary Subsequence Value Sum 题解的更多相关文章

  1. Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum

    E. Binary Numbers AND Sum 题目链接:https://codeforces.com/contest/1066/problem/E 题意: 给出两个用二进制表示的数,然后将第二个 ...

  2. [LeetCode#110, 112, 113]Balanced Binary Tree, Path Sum, Path Sum II

    Problem 1 [Balanced Binary Tree] Given a binary tree, determine if it is height-balanced. For this p ...

  3. Ural 1248 Sequence Sum 题解

    目录 Ural 1248 Sequence Sum 题解 题意 题解 程序 Ural 1248 Sequence Sum 题解 题意 给定\(n\)个用科学计数法表示的实数\((10^{-100}\s ...

  4. Hdoj 1003.Max Sum 题解

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  5. Binary Tree Path Sum

    Given a binary tree, find all paths that sum of the nodes in the path equals to a given number targe ...

  6. 376. Binary Tree Path Sum【LintCode java】

    Description Given a binary tree, find all paths that sum of the nodes in the path equals to a given ...

  7. LeetCode 930. Binary Subarrays With Sum

    原题链接在这里:https://leetcode.com/problems/binary-subarrays-with-sum/ 题目: In an array A of 0s and 1s, how ...

  8. Binary Numbers AND Sum CodeForces - 1066E (前缀和)

    You are given two huge binary integer numbers aa and bb of lengths nn and mmrespectively. You will r ...

  9. LeetCode Continuous Subarray Sum 题解 同余前缀和 Hash表

    文章目录 题意 思路 特殊情况k=0 Source Code 1 Source Code 2 题意 给定一个数组和一个整数k,返回是否存在一个长度至少为2的连续子数组的和为k的倍数. 思路 和上一篇博 ...

  10. 【CF1445D】Divide and Sum 题解

    题目链接 题意简介 将一个长度为 2n 的数列平均分为两个子数列 p 和 q 后,p 按从小到大排序,q 按从大到小排序. 排序后,记 p 为 \(\{x_i\}\) ,q 为 \(\{y_i\}\) ...

随机推荐

  1. Python单元测试标准库unittest简单学习

    1.背景 当需要测试较为复杂的module,class或者系统的功能时,如果一个一个的去测试就会显得很麻烦,如果每项测试又有一定的配置或者设置的话,比如每个测试都要新建一个对象之类的,那就更麻烦了.单 ...

  2. Alexander ——2024年报

    Alexander --2024年报 小总结 知己知彼,百战不殆.2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系. 今年的成 ...

  3. Partition to K Equal Sum Subsets——LeetCode进阶路

    原题链接https://leetcode.com/problems/partition-to-k-equal-sum-subsets/ 题目描述 Given an array of integers ...

  4. TPLINK路由器重启脚本(软件版本3.0.0)

    ​ 家中的两个路由器全都是TPLink路由器,由于总出现时间一长就网卡的原因,写了这个重启脚本在每天凌晨五点的时候对路由器进行自动重启 使用方法: ​ self.logindata的值为登录时的jso ...

  5. echart的使用心得

    前言:由于本人在最近的公司中接触了一些与数据可视化有关的项目,所以特意花了一些时间去学习了echarts,以下是我个人在使用与学习echarts的一些心得体会. 1.首先我们需要知道的是什么是Echa ...

  6. 利用Word制作Kindle用的6寸PDF电纸书

      在word中以自己喜好的字体.字形和行间距等排版,完成后设置布局: 页面(纸张)大小自定义为宽X高=9cm X 12cm 页边距设为4个0.5cm 不要插入页码,占空间 另存为PDF 导入kind ...

  7. Prometheus配置文件详解

    概述 Prometheus是一个开源的系统监控和警报工具包.它的配置文件通常命名为prometheus.yml,用于配置Prometheus服务器的行为. 其配置文件主要包含以下几个部分: globa ...

  8. Spring的一些常见面试题

    Spring八股文 源码解析 反射 1.谈谈spring ioc的理解,原理和实现? 总:两层意思:控制反转和容器. 控制反转:他是一种思想理论,原来的对象是由我们使用者自己来进行控制的,而有了spr ...

  9. 关于MUI框架混合AS开发app项目中遇到的百度地图闪退,不显示地图问题的一次记录

    才进入公司就让我解决MUI混合app出现的BUG,让只会纯纯原生的我有点崩溃,三天就要结果,不过幸不辱命,今天我把这个问题解决了. 这个BUG是:百度地图崩溃导致应用闪退 上图是H5+androidS ...

  10. Graph ⋈ Agent:Chat2Graph 如何重构 GraphRAG 范式?

    引言 去年年底,我在<2024年度 Graph+AI 开源探索思考>一文中,细致拆解并总结了 TuGraph 在「Graph+AI」领域的开源技术实践经验.文中引用了一段业内不成文的观点: ...