专栏文章
题解:CF2077C Binary Subsequence Value Sum
CF2077C题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mipw7oe0
- 此快照首次捕获于
- 2025/12/03 18:57 3 个月前
- 此快照最后确认于
- 2025/12/03 18:57 3 个月前
题目大意
对一个 串 ,记
给出一个长为 的 串 ,支持:
- 将一个位置 翻转
- 求出 所有子序列的 值之和,输出答案对 取模的结果
显然这个 代表的就是区间内 个数减去 个数,因此可以前缀和,用 来表示
那么来看一下一个长度为 的字符串如何求出其 值:
这个二次函数的最大值在对称轴 处取到,而这不一定是整数,因此还要分情况讨论一下:
-
若 为偶数,那么对称轴位置为整数,可以发现,由于 ,因此在 中一定有一个 ,于是
-
若 为奇数,那么最优位置应当为 ,与上面的分析相同,一定存在一个 可以取到这个位置,此时有
发现 这个部分是相同的,于是可以对所有子序列求出 ,再求出所有 为奇数的子序列个数 ,减去 即可
同时容易发现 的奇偶性与 相同,因此
于是问题就变成了求前面这个部分
由于有单点修改,因此考虑使用数据结构进行维护,可以使用线段树,每个节点维护区间长度 ,区间内所有子序列的 即可
合并与修改都是容易的
CPPstruct dat{
int len;
int ans1,ans2;
} tr[N<<2];
dat operator + (const dat& a, const dat& b){
return {a.len+b.len,
(a.ans1+b.ans1+1ll*a.ans1*pw[b.len]+1ll*b.ans1*pw[a.len])%mod,
(a.ans2+b.ans2+1ll*a.ans2*pw[b.len]+2ll*a.ans1*b.ans1+1ll*b.ans2*pw[a.len])%mod};
}
//pw[i]=2^i-1
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...