其他分享
首页 > 其他分享> > abc256 F - Cumulative Cumulative Cumulative Sum

abc256 F - Cumulative Cumulative Cumulative Sum

作者:互联网

题意:

给定数组 \(a[]\),定义数组 \(b[]\) 为 \(a[]\) 的前缀和,\(c[]\) 为 \(b[]\) 的前缀和,\(d[]\) 为 \(c[]\) 的前缀和。两种询问:

思路:

\[d_i=(1+2+\cdots +i)a_1+(1+2+\cdots +(i-1))a_2+\cdots +a_i \\ =\sum_{j=1}^i \frac{(i-j+1)(i-j+2)}{2}a_j \\ = \frac 12\left( \sum_{j=1}^i j^2a_j - (2i+3)\sum_{j=1}^i ja_j+(i+1)(i+2)\sum_{j=1}^i a_j \right) \]

三个树状数组维护这三个前缀和即可

void add(ll i, ll x) {
    add(tr[0], i, x),
    add(tr[1], i, i * x % mod),
    add(tr[2], i, i * i % mod * x % mod);
}

void sol() {
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
        cin >> a[i], add(i, a[i]);

    ll half = qmi(2, mod-2);

    while(q--) {
        ll t, i; cin >> t >> i;
        if(t == 1) {
            add(i, -a[i]);
            cin >> a[i], add(i, a[i]);
        }
        else {
            ll ans = (i+1)*(i+2)%mod * ask(tr[0],i) %mod
                - (2*i+3)%mod * ask(tr[1],i) %mod + ask(tr[2],i);
            (ans *= half) %= mod;
            cout << (ans + mod) % mod << endl;
        }
    }
}

标签:前缀,Sum,Cumulative,tr,add,sum,abc256,ll,mod
来源: https://www.cnblogs.com/wushansinger/p/16403650.html