3155: Preprefix sum

来源:互联网 发布:java 语句 顺序 编辑:程序博客网 时间:2024/06/03 19:19

题目链接

题目大意:单点修改,求前缀和的前缀和

题解:树状数组实现区间修改的思路
SSt=i=1taii=i=1tai(ni+1)(nt)i=1tai

维护两个前缀和,(ni+1)aiai

我的收获:推式子……

#include <iostream>#include <cstdio>#include <cstring>#define ll long longusing namespace std;const int M=100005;int n,m;int a[M];ll c[2][M];void modify(int f,int x,ll val){for(int i=x;i<=n;i+=i&(-i)) c[f][i]+=val;}ll query(int f,int x){ll tmp=0;for(int i=x;i>0;i-=i&(-i)) tmp+=c[f][i];return tmp;}void work(){    char opt[10];int x,y;    for(int i=1;i<=m;i++){        scanf("%s",opt);        if(opt[0]=='Q') scanf("%d",&x),printf("%lld\n",query(1,x)-query(0,x)*(n-x));        else scanf("%d%d",&x,&y),modify(0,x,y-a[x]),modify(1,x,(ll)(n-x+1)*(y-a[x])),a[x]=y;    }}void init(){    cin>>n>>m;    for(int i=1;i<=n;i++){        scanf("%d",&a[i]);        modify(0,i,a[i]);        modify(1,i,(ll)(n-i+1)*a[i]);    }}int main(){    init();    work();    return 0;}