我是这样子做的,可是在WIKIOI上总是WA:
a[i]是原数列
b[i]是差分了一下,即b[i]=a[i]-a[i-1];
c[i]是维护b[i]前缀和的
d[i]是维护[i]*b[i]的前缀和的。
显然S(a[i])=a[1]+a[2]+...+a[n]=b[1]+(b[1]+b[2])+(b[1]+b[2]+b[3])+...+(b[1]+b[2]+...+b[n])=(n-1)*(b[1]+...+b[n])-(1*b[1]+2*b[2]+...+n*b[n])=(n-1)*S(c[n])-S(d[n]);
所以只要用c[i]维护b[i]前缀和,d[i]维护i*b[i]的前缀和就可以了吧。。
每次增减[l,r]只需要plus(l,w)和plus(r+1,-w)即可了吧。。
询问[l,r]之和即输出(r+1)*Sumc(r)-l*Sumc(l-1)-Sumd(r)+Sumd(l-1);即可了吧。。
-------------------------------------------------
所以求助各位,我的思路在哪里有问题么,或者我的代码(2L)有什么问题么。多谢救援!
a[i]是原数列
b[i]是差分了一下,即b[i]=a[i]-a[i-1];
c[i]是维护b[i]前缀和的
d[i]是维护[i]*b[i]的前缀和的。
显然S(a[i])=a[1]+a[2]+...+a[n]=b[1]+(b[1]+b[2])+(b[1]+b[2]+b[3])+...+(b[1]+b[2]+...+b[n])=(n-1)*(b[1]+...+b[n])-(1*b[1]+2*b[2]+...+n*b[n])=(n-1)*S(c[n])-S(d[n]);
所以只要用c[i]维护b[i]前缀和,d[i]维护i*b[i]的前缀和就可以了吧。。
每次增减[l,r]只需要plus(l,w)和plus(r+1,-w)即可了吧。。
询问[l,r]之和即输出(r+1)*Sumc(r)-l*Sumc(l-1)-Sumd(r)+Sumd(l-1);即可了吧。。
-------------------------------------------------
所以求助各位,我的思路在哪里有问题么,或者我的代码(2L)有什么问题么。多谢救援!