zoukankan      html  css  js  c++  java
  • 【学习整理】树状数组 区间修改+查询

    前言:对于区间修改和区间查询这样的简单问题,打一大堆线段树确实是不划算,所以学习了区间修改+区间修查询的树状数组。

    我们定义 a[i] 为原数列,c[i]=a[i]-a[i-1] ,显然  a[n]=displaystyle{sum_{i=1}^{n}}c[i]

    若想要将区间 [l,r] 的数全部 +v 则只需要将 c[l]+v , c[r+1]-v
即可。

    {sum_{i=1}^{n}}a[i]=(c[1])+(c[1]+c[2])+...+(c[1]+c[2]+...+c[n])

                  =n$	imes$c[1]+(n-1)$	imes$c[2]+...+c[n]

                  =n$	imes$(c[1]+c[2]+...+c[n])-(0$	imes$c[1]+1$	imes$c[2]+...+(n-1)$	imes$c[n])

    所以,我们维护一个数组 c_2[i]=(i-1)$	imes$c[i] 

    将区间 [l,r] 的数全部 +v 则还需同时将 c_2[l]+v$	imes$(i-1) , c_2[r+1]+(-v)$	imes$r

    结论:{sum_{i=1}^{n}}a[i]=n$	imes${sum_{i=1}^{n}}c[i]-{sum_{i=1}^{n}}c_2[i]

     

    例题:CODEVS1082 线段树练习3

    http://codevs.cn/problem/1082/

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,q;
    long long a[200005],c[3][200005];
    long long lowbit(long long x){return x&(-x);}
    void modify(int x,long long pos,long long v){for(;pos<=n;pos+=lowbit(pos)) c[x][pos]+=v;}
    long long query(int x,long long pos){long long ret=0LL;for(;pos;pos-=lowbit(pos)) ret+=c[x][pos];return ret;}
    int main()
    {
        int i,j,opt;
        long long l,r,v,sum1,sum2;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            modify(1,i,a[i]-a[i-1]);
            modify(2,i,(i-1)*(a[i]-a[i-1]));
        }
        scanf("%d",&q);
        for(i=1;i<=q;i++)
        {
            scanf("%d%lld%lld",&opt,&l,&r);
            if(opt==1)
            {
                scanf("%lld",&v);
                modify(1,l,v);modify(1,r+1,-v);
                modify(2,l,v*(l-1));modify(2,r+1,-v*r); 
            } 
            else
            {
                sum1=(l-1)*query(1,l-1)-query(2,l-1);
                sum2=r*query(1,r)-query(2,r);
                printf("%lld
    ",sum2-sum1);
            }
        }
        return 0;
        
    }
  • 相关阅读:
    利用 img 和 script 发送跨域请求
    tomcat 内存配置
    servlet request.getParamter 有时获取参数为null
    windows本地无法启动sqlserver服务
    mac用virtualbox 装win7联网及分辨率设置
    奇怪的transform bug
    mysql 同时执行多条update语句
    二进制树形算法
    协议栈中使用crc校验函数
    引用布局
  • 原文地址:https://www.cnblogs.com/yljiang/p/6057394.html
Copyright © 2011-2022 走看看