• BZOJ 3155: Preprefix sum


    大意:给一个数组,先求出SUM[I],然后动态的求出1-I的SUM[I]的和,

           这题得化公式:

          树状数组维护两个和:SUM(A[I])(1<=I<=X);

                                      SUM(A[I]*(N-I+1)) (1<=I<=X);

                                     答案就是:SUM(A[I]*(N-I+1))-SUM[A[I]]*(N-X) (1<=I<=X);

                               

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int N=110001;
    ll s[N],t[N];
    int a[N];
    int n;
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    void update1(int x,ll v)
    {
        while (x<=n)
        {
            s[x]+=v;
            x+=lowbit(x);
        }
    }
    
    void update2(int x,ll v)
    {
        while (x<=n)
        {
            t[x]+=v;
            x+=lowbit(x);
        }
    }
    
    ll sum1(int x)
    {
        ll ans=0;
        while (x)
        {
            ans+=s[x];
            x-=lowbit(x);
        }
        return ans;
    }
    ll sum2(int x)
    {
        ll ans=0;
        while (x)
        {
            ans+=t[x];
            x-=lowbit(x);
        }
        return ans;
    }
    
    
    int main()
    {
        int m;
        char s[8];
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            update1(i,a[i]);
            update2(i,(ll)a[i]*(n-i+1));
        }
    
        while (m--)
        {
            int x,y;
            scanf("%s%d",s,&x);
            if (s[0]=='Q')
            {
                printf("%lld
    ",sum2(x)-sum1(x)*(n-x));
            }
            else
            {
                scanf("%d",&y);
                update1(x,y-a[x]);
                update2(x,(ll)(y-a[x])*(n-x+1));
                a[x]=y;
            }
        }
        return 0;
    }
  • 相关阅读:
    各种有趣言论收集
    人类未来进化方向恶考
    mysql 列所有表行数
    恩,有那么一个人
    00后厉害哇
    。。。。
    放弃微博,继续回来写月经
    嘿,大家还好吗
    git
    require js
  • 原文地址:https://www.cnblogs.com/forgot93/p/3809948.html
Copyright © 2020-2023  润新知