1 条题解

  • 0
    @ 2025-12-10 16:01:20

    「SHOI2016」随机序列 题解 题意 有 nn 个数 a1,a2,,ana_1,a_2,\dots,a_n

    每两个数之间可以填 +,,×+,-,× 三种符号,共 3n13^{n-1} 个表达式

    需要支持修改 aia_i,求所有表达式值的和 mod109+7\bmod 10^9+7

    核心观察

    1. 关键性质 考虑一个表达式,从第一个加减号出现的位置开始分割:

    设第一个加减号在第 kk 个位置(aka_kak+1a_{k+1} 之间)

    那么表达式形式为:[a1×a2××ak] 符号 [后面的部分][a_1×a_2×\cdots×a_k] \ \text{符号} \ [\text{后面的部分}]

    前面的部分是连续乘积,后面是任意的表达式

    1. 统计贡献 对于每个位置 ii1i<n1 \le i < n):

    ii 结尾的连续乘积:Pi=a1×a2××aiP_i = a_1 × a_2 × \cdots × a_i

    aia_iai+1a_{i+1} 之间填 ++-

    PiP_i 对总和的贡献:+Pi+P_iPi-P_i

    两种情况出现的次数相等:各 3ni13^{n-i-1}

    所以总贡献抵消为 00

    1. 唯一有贡献的项 如果在 aia_iai+1a_{i+1} 之间填 ××,则 PiP_i 会被继续乘下去

    实际上,只有整个表达式都是乘号时(a1×a2××ana_1×a_2×\cdots×a_n)的项会保留

    但这样不对...让我们仔细分析

    正确推导 公式 令 Pi=a1×a2××aiP_i = a_1 × a_2 × \cdots × a_i(前缀乘积)

    总和的公式为:

    总和

    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 ​

    其中 PnP_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. 预处理 计算 Pi=a1×a2××aiP_i = a_1 × a_2 × \cdots × a_i(前缀积)

    预处理 3kmodM3^k \bmod M

    1. 线段树维护 每个修改影响:

    ata_t 改变 → Pt,Pt+1,,PnP_t, P_{t+1}, \dots, P_n 都改变

    建立线段树,每个节点维护:

    区间乘积 prodprod

    区间和 sum=i=lrf(i)×Pisum = \sum_{i=l}^{r} f(i) × P_i',其中 PiP_i' 是相对于区间起点的乘积

    合并时:

    prod=left.prod×right.prodprod = left.prod × right.prod

    sum=left.sum+left.prod×right.sumsum = left.sum + left.prod × right.sum

    1. 查询 根节点的 sumsum 就是答案。

    复杂度 预处理:O(n)O(n)

    每次修改:O(logn)O(\log n)

    总复杂度:O(n+Qlogn)O(n + Q \log n)

    • 1

    信息

    ID
    6004
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者