定义:
- 定义一个数组S,S[i]表示a[1]到a[i]的和
- 那么求[l,r]区间的和,求出S[r]-S[l]即可
- 数组S存储的就是前缀和
实现:
#include<iostream>
using namespace std;
int a[1000001];
int S[1000001];
int main()
{
int i, j, k;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
S[i] = S[i - 1] + a[i];
}
return 0;
}
问题1:求区间内数字的和
- 给出了一个数组(数组长度<100000),再给出了一个区间[l,r],求区间的和
- 每个数字大小不超过1000
#include<iostream>
using namespace std;
int a[1000001];
int S[1000001];
int main()
{
int i, j, k;
int n, l, r;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
S[i] = S[i - 1] + a[i];
}
cin >> l >> r;
cout << S[r] - S[l - 1];
return 0;
}
问题2:求区间和最大值
- ans=max(S[j]-min(S[i]),j=1…n,i=1…j-1)
- 以j作为终点的区间,答案是什么?
- S[j]-S[i]尽可能地大,现在j是确定的。
- 让S[i]尽可能地小,那么就是min(S[i])