abc256 F - Cumulative Cumulative Cumulative Sum
作者:互联网
题意:
给定数组 \(a[]\),定义数组 \(b[]\) 为 \(a[]\) 的前缀和,\(c[]\) 为 \(b[]\) 的前缀和,\(d[]\) 为 \(c[]\) 的前缀和。两种询问:
1 i x
:把 \(a_i\) 改成 \(x\)2 i
:输出 \(d_i\)
思路:
\[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