zoukankan      html  css  js  c++  java
  • 树状数组之 ——区间更新,单点查询;区间更新,区间查询;

    //修改区间,查询点
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn=100005;
    const int maxq=100005;
    int a[maxn];int b[maxn];int c[maxn];
    //a原数组,b是a的差分数组,c是b的树状数组
    int lowbit(int x){
        return x&(-x);
    }
    int n,q;
    void c_update(int x,int y){
        for(;x<=n;x+=lowbit(x)) c[x]+=y;
    }
    void update(int x,int y,int z){
        b[x]+=z;
        b[y+1]-=z;
        c_update(x,z);
        c_update(y+1,-z);
    }
    int sum(int x)
    {
        int ans=0;
        for(;x>0;x-=lowbit(x))
            ans+=c[x];
        return ans;
    }
    int main()
    {
        int x,y;
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        b[1]=a[1];
        c_update(1,b[1]);
        for(int i=2;i<=n;i++){
            b[i]=a[i]-a[i-1];
            c_update(i,b[i]);
        }
        cin>>q;
        while(q--){
            cin>>x;
            if(x==1){
                int y,z,w;
                cin>>y>>z>>w;
                update(y,z,w);
            }
            if(x==2){
                cin>>y;
                cout<<sum(y)<<endl;
            }
        }
        return 0;
    }
    
    //修改区间,区间查询
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=200005,maxq=200005;
    int n,q;
    int lowbit(int x){
        return x&(-x);
    }
    long long delta[maxn]; //差分数组
    long long deltai[maxn]; //delta*i
    long long sum[maxn];//原始前缀和
    void update(long long *c,int x,int y)
    {
        for(;x<=n;x+=lowbit(x))
            c[x]+=y;
    }
    long long query(long long *c,int x)
    {
        long long ans=0;
        while(x>0)
        {
            ans+=c[x];
            x-=lowbit(x);
        }
        return ans;
    }
    int main()
    {
        int x;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>x;
            sum[i]=sum[i-1]+x;
        }
        cin>>q;
        while(q--)
        {
            cin>>x;
            if(x==1)//区间更新
            {
                int y,z,w;
                cin>>y>>z>>w;
                update(delta,y,w);
                update(delta,z+1,-w);
                update(deltai,y,w*y);
                update(deltai,z+1,-w*(z+1));
            }
            if(x==2)//区间求和
            {
                int y,z;
                cin>>y>>z;
                long long suml=sum[y-1]+y*query(delta,y-1)-query(deltai,y-1);
                long long sumr=sum[z]+(z+1)*query(delta,z)-query(deltai,z);
                cout<<sumr-suml<<endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    一张图片入门Python
    4.1. 如何在Windows环境下开发Python
    你必须知道的EF知识和经验
    XUnit的使用
    如何使用NUnit
    Entity Framework 不支持DefaultValue
    Have You Ever Wondered About the Difference Between NOT NULL and DEFAULT?
    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details
    Entity Framework 与多线程
    sqlite中的自增主键
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160172.html
Copyright © 2011-2022 走看看