zoukankan      html  css  js  c++  java
  • 树状数组之区间修改单点查询

    树状数组的区间修改单点查询

    树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组,

    比如:                a[10]={4, 6, 7, 5, 1, 6, 3, 4, 2, 7}

    对应的差分数组  c[10]={4, 2,1,-2,-4, 5,-3, 1,-2, 5}

    c[i]=a[i]-a[i-1]

    然后c[4]=a[0]+a[1]+a[2]+a[3]

    我们当前的那个c[i]变量就等于前i项a[i]和

    我们就按之区间查询单点修改的方法把这个c数组存下来

    如果我们把[l,r]区间的值都加上num的话我们实际上只要把c数组的c[l]+=num,c[r+1]-=num;

    这个是怎么来的呢,举个例子 1 3 5 7 9

           对应的c数组  1  2 2 2 2

    我们把[2,3]都加个2,对应的两个数组就变为

                 1  5  7 9 9

                  1 4  2  2  0

    因为中间都加的是一样的数,所以只要修改两端就行

     但是我们核心还是树状数组,所以我们之前包含要修改的数的区间都要修改

    所以和之前的单点修改一样了,只是区间[l,r]树状数组只能修改[l,n],[r+1,n]

    我们就先用[l,n]都加上num,然后[r+1,n]都减个num

    所以我们实现代码就也很简单了,就是插数的时候用add(l,num) add(r+1,-num)

    找a[i]的时候就是sum(i)

  • 相关阅读:
    MyEclipse 使用快捷键
    修改MyEclipse默认的Servlet和jsp代码模板
    设置MyEclipse开发项目时使用的JDK
    65.广搜练习:细胞数目
    65.广搜练习:细胞数目
    61.新的开始(最小生成树)
    61.新的开始(最小生成树)
    66.广搜练习:最少关卡路
    66.广搜练习:最少关卡路
    64.广搜练习跳马问题
  • 原文地址:https://www.cnblogs.com/Lis-/p/9361909.html
Copyright © 2011-2022 走看看