差分+树状数组

题目:

已知一个数列,你需要进行下面两种操作:

1.将某区间每一个数数加上x

2.求出某一个数的值

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

解法:

  1. 直接线段树(好东西哈哈哈哈哈
  2. 差分+树状数数组

     线段树就不用说了,直接建树,修改,查询三个基础操作。重头戏是第二种解决方法。

    差分:

             对于数组a[n],a[0]=0,n>=1,有数组b[n]=a[n-1]+a[n]。知道了数组a之后我们就可以很轻松的求出b数组。

             以下摘自洛谷题解,侵删。

             设数组a[]={1,6,8,5,10},那么差分数组b[]={1,5,2,-3,5},可以证明,a[i]=b[1]+....+b[i]。若对数组a的区间[2,4]都加上2,a数组变为a[]={1,8,10,7,10},b数组变为b={1,7,2,-3,3};可以发现一个性质,若a[l,r]都加上一个数t,那么b改变的只有b[l]和b[r+1]。为什么呢?很显然,对任意i属于[l,r-1],b[i+1]-b[i]并没有改变。对于b[l],a[l]-[l-1]变大了t,对于b[r+1],a[r+1]+a[r]变小了t。

ORZ谢谢洛谷大佬的讲解。

     解决:

             对于数组a,维护差分数组b,求a[i]就直接求b区间[1,i]。区间修改a就直接两个单点修改b。撒花完结!:)

猜你喜欢

转载自blog.csdn.net/ffscas/article/details/87284346