前缀和与差分是算法竞赛中常用的技巧,前者用于快速求区间和,后者用于高效进行区间修改。
int n; // Array size.
std::vector<int> a; // Array. (indexed from 1)
std::vector<int> ps; // Prefix sum array.
// Calculate prefix sum.
void prefix_sum() {
ps = a;
// Or simply:
// std::partial_sum(a.begin(), a.end(), ps.begin());
for (int i = 1; i <= n; ++i) {
ps[i] += ps[i - 1];
}
}
// Query sum of elements in [l, r].
int query(int l, int r) { return ps[r] - ps[l - 1]; }
一个简单的版本
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
int a[MAXN];
int s[MAXN];
int main(){
int n,m;
cin >> n >> m;
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++) a[i]=i;//数列12345...
for(int i=1;i<=n;i++){
s[i] = s[i-1] + a[i];
}
while(m--){
int l,r;
cin >> l >> r;
cout << s[r]-s[l-1] << endl;
}
return 0;
}