1 条题解
-
0
「SHOI2016」随机序列 题解 题意 有 个数
每两个数之间可以填 三种符号,共 个表达式
需要支持修改 ,求所有表达式值的和
核心观察
- 关键性质 考虑一个表达式,从第一个加减号出现的位置开始分割:
设第一个加减号在第 个位置( 和 之间)
那么表达式形式为:
前面的部分是连续乘积,后面是任意的表达式
- 统计贡献 对于每个位置 ():
以 结尾的连续乘积:
在 和 之间填 或 :
对总和的贡献: 或
两种情况出现的次数相等:各 次
所以总贡献抵消为 !
- 唯一有贡献的项 如果在 和 之间填 ,则 会被继续乘下去
实际上,只有整个表达式都是乘号时()的项会保留
但这样不对...让我们仔细分析
正确推导 公式 令 (前缀乘积)
总和的公式为:
总和
P 1 × 2 × 3 n − 2 + P 2 × 2 × 3 n − 3 + ⋯ + P n − 1 × 2 × 3 0 + P n 总和=P 1 ×2×3 n−2 +P 2 ×2×3 n−3 +⋯+P n−1 ×2×3 0 +P n
其中 是全乘积项(全是乘号)。
简化 可以写成:
总和
∑ i
1 n − 1 2 × P i × 3 n − i − 1 + P n 总和= i=1 ∑ n−1 2×P i ×3 n−i−1 +P n
或更简洁:
总和
∑ i
1 n f ( i ) × P i 总和= i=1 ∑ n f(i)×P i
其中 $f(i) = \begin{cases} 2 × 3^{n-i-1} & i < n \ 1 & i = n \end{cases}$
算法实现
- 预处理 计算 (前缀积)
预处理
- 线段树维护 每个修改影响:
改变 → 都改变
建立线段树,每个节点维护:
区间乘积
区间和 ,其中 是相对于区间起点的乘积
合并时:
- 查询 根节点的 就是答案。
复杂度 预处理:
每次修改:
总复杂度:
- 1
信息
- ID
- 6004
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者