AcWing 795:一维前缀和

【题目来源】
https://www.acwing.com/problem/content/797/

【问题描述】
输入一个长度为 n 的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

【输入格式】
第一行包含两个整数 n 和 m。
第二行包含 n 个整数,表示整数数列。
接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。

【输出格式】
共m行,每行输出一个询问的结果。

【数据范围】
1 ≤ l ≤ r ≤ n,
1 ≤ n , m ≤ 100000,
− 1000 ≤ 数 列 中 元 素 的 值 ≤ 1000;

【输入样例】
5 3
2 1 3 6 4
1 2
1 3
2 4

【输出样例】
3
6
10

【算法分析】
前缀和,无论是一维前缀和还是二维前缀和,通常都用于快速计算区间和。
它们的思想都是利用给定的数据预先处理出一个前缀和数组,之后在计算区间和的时候查表,从而可以大大降低算法的时间复杂度。
一维前缀和数组预处理过程:sum[i]=sum[i-1]+a[i]
一维区间和计算过程:sum[y]-sum[x-1]      (y≥x)
二维前缀和数组预处理过程:sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]
二维区间和计算过程:sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]      (y2≥y1,x2≥x1)

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=100010;

int a[maxn], s[maxn];

int main() {
    int n, m;
    scanf("%d%d", &n, &m);

    for(int i=1; i<=n; i++) {
        scanf("%d", &a[i]);
        s[i]=s[i-1]+a[i];
    }

    while(m--) {
        int le, ri;
        scanf("%d%d", &le, &ri);

        printf("%d\n",s[ri]-s[le-1]);
    }

    return 0;
}



/*
in:
5 3
2 1 3 6 4
1 2
1 3
2 4

out:
3
6
10
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/120265452
https://blog.csdn.net/weixin_45776544/article/details/115334481



 

Supongo que te gusta

Origin blog.csdn.net/hnjzsyjyj/article/details/120632159
Recomendado
Clasificación