酷代码 AI
菜单
服务商

题目描述 给定一个长度为 n 的序列,进行 q 次询问。 每次询问输入 [l,r],输出 [l,r] 中所有以 l 开头的子区间的总和。 也就是说,你需要计算 [l,l],[l,l+1],…,[l,r−1],[l,r] 的总和。 输入格式 第一行输入两个数 n,q。 第二行输入 n 个数字 a i ​ 。 接下来 q 行,每行输入两个数 l,r。 输出格式 输出 q 行,每次询问的结果。 c++

```cpp #include <iostream> #include <vector> using namespace std; // 计算以 l 开头,到 r 结束的所有子区间的总和 long long calculateSum(const vector<int>& arr, int l, int r) { long long result = 0; // 遍历从 l 到 r 的每个可能的子区间 for (int end = l; end <= r; ++end) { // 计算当前子区间 [l, end] 的和 for (int i = l; i <= end; ++i) { result += arr[i - 1]; // 数组下标从 0 开始,所以要减 1 } } return result; } int main() { int n, q; cin >> n >> q; vector<int> arr(n); // 读取序列 for (int i = 0; i < n; ++i) { cin >> arr[i]; } // 处理每次询问 for (int i = 0; i < q; ++i) { int l, r; cin >> l >> r; // 计算并输出结果 cout << calculateSum(arr, l, r) << endl; } return 0; } ``` 代码解释: 1. `calculateSum` 函数用于计算以 `l` 开头,到 `r` 结束的所有子区间的总和。通过两层循环,外层循环控制子区间的结束位置,内层循环计算当前子区间的和。 2. `main` 函数首先读取序列的长度 `n` 和询问的次数 `q`,然后读取序列中的元素。接着处理每次询问,读取询问的区间 `[l, r]`,调用 `calculateSum` 函数计算结果并输出。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 数组下标从 0 开始,而输入的区间 `[l, r]` 是从 1 开始计数的,所以在访问数组元素时要注意下标减 1。 2. 由于结果可能会很大,需要使用 `long long` 类型来存储总和,避免整数溢出。 3. 对于大规模数据,这种暴力计算的方法时间复杂度较高,可能会超时,需要考虑使用更高效的算法。 [2025-11-05 19:59:56 | AI写代码神器 | 543点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多