首页 留言 登录
一维前缀和

前缀和与差分是算法竞赛中常用的技巧,前者用于快速求区间和,后者用于高效进行区间修改。

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;
}
上一篇:二维前缀和
下一篇:1150:求正整数2和n之间的完全数
验证码
评论留言 (0条)