前缀和在竞赛中,往往起到优化算法的重要步骤。
前缀和的定义
定义一个合集a和s,a下标从1开始,si表示从a1到ai的数字之和。
合集s只需要O(N)的时间复杂度即可实现。
for (int i = 1; i <= n; i++)
s[i] = s[i - 1] + a[i];
这里的i是从1开始的,因此si不用担心是否会越界。
前缀和的使用
已知j≥i且j≤N,1≤i
通过数学方法,我们可以得知以下等式
sj−si
=a1+a2+…+aj−1+aj−a1−a2−…−ai−1−ai
=aj+aj−1+…+ai+1
结果可以发现,代码s[j] - s[i]
就可以得到ai+1到aj的区间和。
那么想要求得ai到aj的区间和,就可以用代码s[j] - s[i - 1]
得出。