题解:CF2077C Binary Subsequence Value Sum
题目大意
对一个
给出一个长为
- 将一个位置
0/1 翻转 - 求出
s 所有子序列的f 值之和,输出答案对998244353 取模的结果
显然这个
那么来看一下一个长度为
这个二次函数的最大值在对称轴
-
若
p_n 为偶数,那么对称轴位置为整数,可以发现,由于|p_i-p_{i-1}|=1 ,因此在1\sim n 中一定有一个p_i=\dfrac{p_n}{2} ,于是f(v)=\dfrac{p_n^2}{4} -
若
p_n 为奇数,那么最优位置应当为\dfrac{p_n-1}{2} ,与上面的分析相同,一定存在一个p_i 可以取到这个位置,此时有f(v)=\dfrac{p_n^2-1}{4}=\dfrac{p_n^2}{4}-\dfrac{1}{4}
发现
同时容易发现
于是问题就变成了求前面这个部分
由于有单点修改,因此考虑使用数据结构进行维护,可以使用线段树,每个节点维护区间长度
合并与修改都是容易的
struct 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