【思想】前缀和、差分、倍增

前缀和、差分和倍增,没啥关系,只是单列太简短了…

前缀和

sum[i]=a[i]+sum[i1]sum[i]=a[i]+sum[i-1]

i=lra[i]=sum[r]sum[l1]\sum_{i=l}^{r}a[i]=sum[r]-sum[l-1]

差分

d[i]=a[i]a[i1]d[i]=a[i]-a[i-1]

区间修改[x,y][x,y] ,那么[x,y][x,y] 之间的数相对关系不变,差分数组的值不变,唯一变的是差分数组第xx 项(表示xxx1x-1 的差,改变了)和第y+1y+1 项:以区间[x,y][x,y]cc 为例,差分数组的修改为:d[x]+=c,d[y+1]=cd[x]+=c,d[y+1]-=c

a[x]=i=1xd[i]+a[0]a[x]=\sum_{i=1}^{x}d[i]+a[0]

另一种利用差分数组获得第xx 项的值的方法:差分数组dd 初始化为00 ,区间修改对dd 进行,而新的第xx项值为:a[x]+i=1xd[i]a[x]+\sum_{i=1}^{x}d[i]

倍增

  • 原理:1,2,4,8,...2i1,2,4,8,...2^i 能表示[1,2i+1)[1,2^{i+1}) 中的所有数
  • 核心:a[x][i]=a[a[x][i1]][i1]a[x][i]=a[a[x][i-1]][i-1]
  • 将规模从O(n)O(n) 降到O(logn)O(\log n) ,查询时遍历二进制每一位累和答案即可。