ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

题解:洛谷 P8218 【深进1.例1】求区间和

2026/8/7 8:48:47 拓冰建站 浏览量
题解:洛谷 P8218 【深进1.例1】求区间和

【题目来源】

洛谷:P8218 【深进1.例1】求区间和 - 洛谷

【题目描述】

给定 \(n\) 个正整数组成的数列 \(a_1, a_2, \cdots, a_n\)\(m\) 个区间 \([l_i,r_i]\),分别求这 \(m\) 个区间的区间和。

对于所有测试数据,\(n,m\le10^5,a_i\le 10^4\)

【输入】

第一行,为一个正整数 \(n\)

第二行,为 \(n\) 个正整数 \(a_1,a_2, \cdots ,a_n\)

第三行,为一个正整数 \(m\)

接下来 \(m\) 行,每行为两个正整数 \(l_i,r_i\) ,满足\(1\le l_i\le r_i\le n\)

【输出】

\(m\) 行。

\(i\) 行为第 \(i\) 组答案的询问。

【输入样例】

4
4 3 2 1
2
1 4
2 3

【输出样例】

10
5

【算法标签】

《洛谷 P8218 求区间和》 #前缀和#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int MAX_N = 100005;  // 定义数组最大长度
int n, m;                   // n: 数组长度, m: 查询次数
int a[MAX_N];               // 存储原始数组
int s[MAX_N];               // 存储前缀和数组int main()
{// 输入数组长度cin >> n;// 输入数组元素并计算前缀和for (int i = 1; i <= n; i++){cin >> a[i];s[i] = s[i - 1] + a[i];  // 前缀和公式:s[i] = s[i-1] + a[i]}// 输入查询次数cin >> m;// 处理每个查询for (int i = 1; i <= m; i++){int l, r;  // 查询区间[l, r]cin >> l >> r;// 输出区间和:s[r] - s[l-1]cout << s[r] - s[l - 1] << endl;}return 0;
}
// 使用acwing模板二刷
#include <bits/stdc++.h>
using namespace std;const int N = 100005;  // 定义数组最大长度
int n, m;              // n: 数组长度, m: 查询次数
int a[N];              // 原始数组
int s[N];              // 前缀和数组int main()
{// 输入数组长度cin >> n;// 输入数组元素for (int i = 1; i <= n; i++)cin >> a[i];// 计算前缀和数组for (int i = 1; i <= n; i++)s[i] = s[i - 1] + a[i];  // s[i] = 前i项的和// 输入查询次数cin >> m;// 处理每个查询while (m--){int l, r;  // 查询区间[l, r]cin >> l >> r;// 输出区间和:s[r] - s[l-1]cout << s[r] - s[l - 1] << endl;}return 0;
}

【运行结果】

4
4 3 2 1
2
1 4
10
2 3
5