题目:
已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数数加上x
2.求出某一个数的值
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
解法:
- 直接线段树(好东西哈哈哈哈哈
- 差分+树状数数组
线段树就不用说了,直接建树,修改,查询三个基础操作。重头戏是第二种解决方法。
差分:
对于数组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。撒花完结!:)