如果来看这个Blog的,应该都对(前缀和这个概念很模糊吧)(巨佬到左上角,点那个退出的箭头谢谢 )
前缀和就是一个重要的预处理,能大大的降低时间复杂度。,很难理解对吧,那就这么记“求前N(i)项的的和”.
举个栗子:
Free Pascal 代码:
a[0]:=0;
for i:=1 to n do
begin
read(a[i]);
a[i]:=a[i]+a[i-1];
end;
C++代码:
a[0]=0;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]:=a[i]+a[i-1];
}
如果输出a[n],就会输出n的累加。
来到例(水)题练练手吧:
有 N 个的正整数放到数组 A 里,现在要求一个新的数组 B,新数组的第 i 个数 B[i]是原数组 A 第 1 到第 i 个数的和。求B的第t个数.
样例输入:
3->n
2 3 1->a[i]
3->t
样例输出:
6
这道题很明显,B数组的第i位=A数组的第1位~第i位的,
所以对于这道题,我们有两种做法:
var
n,i,t:longint;
a,b:array[0..1000005] of int64;
begin
readln(n);
a[0]:=0;
for i:=1 to n do
begin
read(a[i]);
a[i]:=a[i]+a[i-1];
b[i]:=a[i];
end;
readln(t);
writeln(b[t]);
end.
#include
using namespace std;
int N, A[10000], B[10000],t;
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
B[0] = A[0];
for (int i = 1; i < N; i++) {
B[i] = B[i - 1] + A[i];
}
cin >> t;
cout << b[t];
return 0;
}
首先, B[0] = A[0]; ,前缀和数组的第一项和原数组的第一项是相等的。
B[i] = B[i-1] + A[i] 意思就是:前缀和数组的第 i 项 = 原数组的 0 到 i-1 项的和 + 原数组的第 i 项。
小怪已刷完……
送一道经典例题洛谷U53525 前缀和(例题)
附上ACPascal代码:
var
n,i:longint;
a,b:array[0..1000005] of int64;
begin
readln(n);
a[0]:=0;
for i:=1 to n do
begin
read(a[i]);
a[i]:=a[i]+a[i-1];
b[i]:=a[i];
end;
for i:=1 to n do
begin
write(b[i],' ');
end;
end.
怎么感觉没什么用呀?一开始看不出来,那就看下一期吧!全是干活哟。
下一章《详解 前缀和《秩序白银———修炼成仙章》》