【算法】【前缀和】acwing算法基础 795. 前缀和

题目

输入一个长度为 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

来源:acwing算法基础 795. 前缀和


思路(注意事项)

先求出 前缀和 数组。(枚举时间超时)


纯代码

#include
using namespace std;
int main(){
    int n, m;
    cin >> n >> m;
    vector<int> sum(n + 1);
    for (int i = 1; i < n + 1; i ++) {
		int t;
		cin >> t;
		sum[i] = sum[i - 1] + t;
	}
    while (m --){
    	int l, r;
    	cin >> l >> r;
    	cout << sum[r] - sum[l - 1] << endl;
	}
    return 0; 
}

题解(带注释)

#include
using namespace std;

int main() {
    int n, m; // n 表示数组的长度,m 表示查询的次数
    cin >> n >> m; // 输入 n 和 m

    vector<int> sum(n + 1); // 定义前缀和数组 sum,大小为 n+1

    // 计算前缀和数组
    for (int i = 1; i < n + 1; i++) {
        int t; // 当前输入的数字
        cin >> t;
        sum[i] = sum[i - 1] + t; // 计算前缀和:sum[i] = sum[i-1] + t
    }

    // 处理 m 次查询
    while (m--) {
        int l, r; // 查询的区间 [l, r]
        cin >> l >> r; // 输入查询的区间
        cout << sum[r] - sum[l - 1] << endl; // 输出区间和:sum[r] - sum[l-1]
    }

    return 0;
}

你可能感兴趣的:(输入输出,算法,前缀和,算法,数据结构,c++,前缀和)