CF2077C Binary Subsequence Value Sum 题解

news/2025/3/12 8:13:58/文章来源:https://www.cnblogs.com/YhjOI/p/18766617

前言:

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

题意:

给出一个长度为 \(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(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897526.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

值得推荐的IT公司名单(国企篇)

大家好,今天我们来盘点一下值得推荐的国企,这些企业在行业内具有举足轻重的地位,不仅主营业务突出,福利待遇优厚,尤其是研发岗位的薪资区间,更是让人眼前一亮。十大顶尖央企国企,待遇优厚如天花板级别!(排名不分先后)1、中国烟草总公司 人家都说能成为烟草总公司的一…

Entity Framework Core 数据库迁移

EF Core 通过两种方式来保持**模型**和**数据库架构**同步。 迁移 Code First 反向工程 Db First 管理迁移 通过EF Core 命令行工具来管理迁移 安装EF Core 命令行工具# 安装 dotnet-ef dotnet tool install --global dotnet-ef# 验证安装 dotnet ef# 更新工具 dotnet tool upd…

Roslyn 分析器已知问题 传递项目属性时将忽略分号之后的内容

本文记录 Roslyn 分析器、源代码生成器的已知问题,通过CompilerVisibleProperty 传递值时,所有在 `;`、`#` 和换行符之后的字符都会被忽略相关问题链接:https://github.com/dotnet/roslyn/issues/43970 https://github.com/dotnet/roslyn/issues/51692此问题由 walterlv 发现…

Avalonia 已知问题 继承滚动条将让里层控件无法获得无穷大空间

本文记录 Avalonia 的一个已知问题,如果有代码里面编写一个类型继承 ScrollViewer 类型,然后这个类型里面啥都不做。那将会导致所有放在此滚动条里面的控件无法获取无穷大的空间,其宽高无法撑开,被限定为上层容器尺寸复现步骤如下:新建一个 FooScrollViewer 类型,让其继承…

读DAMA数据管理知识体系指南17数据存储和操作治理

读DAMA数据管理知识体系指南17数据存储和操作治理1. 管理数据库性能 1.1. 数据库的性能取决于两个相互依赖的因素:可用性和响应速度 1.2. 性能包括确保空间的可用性、查询优化以及其他能使数据库以有效的方式返回数据的因素1.2.1. 如果没有可用性,就无法衡量数据库的性能1.2.…

干货分享!厦大140页PPT读懂大模型,从概念到实践

干货分享!厦大140页PPT读懂大模型 《厦门大学:大模型概念、技术与应用实践》 是由厦门大学大数据教学团队出品的DeepSeek科普类内容。文章涵盖:人工智能发展简史 人工智能思维 大模型:人工智能的前沿 AIGC应用与实践内容分享:引言 在数字化浪潮汹涌澎湃的当下,大模型如同…

一款基于.NET开源、强大的网络管理和网络问题排查工具!

前言 今天大姚给大家分享一款基于.NET开源、免费、功能强大的网络管理和网络问题排查工具:NETworkManager。 项目介绍 NETworkManager 是一个基于.NET开源(GPL-3.0 license)、免费、功能强大的开源工具,旨在帮助用户管理和解决网络问题。通过提供一系列网络连接和管理工具,…

Palera1n之苹果手机越狱,iOS15~iOS 18有根越狱方法

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。其他越狱方式可参考:https://www.cnblogs.com/codtina/可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支…

Palera1n苹果手机越狱,iOS15~iOS 18有根越狱方法

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。其他越狱方式可参考:https://www.cnblogs.com/codtina/可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支…

Palera1n iOS15.8.2~iOS 18有根越狱教程

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支持 arm64e 设备。A11设备在使用前需要关闭锁屏密码,如…

POV vs FPV All In One

POV vs FPV All In One FPV 只是 POV 的一种特殊形式 ✅ point-of-view 视点 first-person view 第一人称视角POV vs FPV All In OneFPV 只是 POV 的一种特殊形式 ✅FPV is similar to the POV drone shot—however, the equipment makes the shooting experience quite differ…