- 分享
前缀和与差分
- @ 2026-7-30 9:24:02
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
/*
设前 i 个数字的和为:s[i]
s[1] = a[1];
s[2] = a[1] + a[2];
s[3] = a[1] + a[2] + a[3];
s[4] = a[1] + a[2] + a[3] + a[4];
s[5] = a[1] + a[2] + a[3] + a[4] + a[5];
求区间 [3, 5] 的和
s[5] - s[2]
求区间 [10, 100] 的和
s[100] = a[1] + a[2] + ... + a[100];
a[10] + a[11] + a[12] + ... + a[100];
s[100] 相比于区间[10, 100],多了a[1]+a[2]+...+a[9]
s[100] - s[9]
求区间 [l, r] 的和
s[r] - s[l-1];
[1, r]的和 - [1, l-1]的和
怎么能快速求出 数组 s
s[1] = a[1];
s[2] = a[1] + a[2];
s[3] = a[1] + a[2] + a[3];
s[4] = a[1] + a[2] + a[3] + a[4];
s[5] = a[1] + a[2] + a[3] + a[4] + a[5];
s[2] 比 s[1]多了一个 a[2]
s[2] = s[1] + a[2]
s[3] 比 s[2]多了一个 a[3]
s[3] = s[2] + a[3]
s[4] 比 s[3]多了一个 a[4]
s[4] = s[3] + a[4]
s[5] 比 s[4]多了一个 a[5]
s[5] = s[4] + a[5]
s[i] 比 s[i-1] 多了一个 a[i]
s[i] = s[i-1] + a[i]
for(int i = 1; i <= n; i ++ ){
s[i] = s[i-1] + a[i];
}
*/
int n, m;
int a[N], s[N];
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++ ){
cin >> a[i];
s[i] = s[i-1] + a[i];
}
while(m -- ){
int l, r;
cin >> l >> r;
cout << s[r] - s[l-1] << '\n';
}
return 0;
}
1 条评论
-
杨颜瑗 白银 Lv.破阵 @ 2026-7-30 14:11:09你好,一楼
- 1