前缀和

编号
a1234567891011121314151617
b10111213

现在要从a数组中截取b数组知道b的和1000000次,而且不能够直接记下b数组的值,要一次一次算,怎么快速求?

这样看也许看不出什么,但是我再画一幅图你就明白了

编号
c12345678910111213~~~~
d123456789~~~~~~~~

可见c-d即为b
也就是
(1+2+…+13)-(1+2+…+9)

好,下面我来说一下怎么做

先把
sum[1]=1,
sum[2]=1+2,
sum[3]=1+2+3

sum[17]=1+2+…+17
所有从1开始依次向后加的值都算出来
想要求区间和(n-m)的和,只要用sum[m]-sum[n]就可以了

原本O(4000000)变成了O(2000153),如果区间越长,次数越多,优势更大。

这是NOIP比赛中的常见思想!一定要学会的。


版权声明:本文为johnwayne0317原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。