区间浇水问题:C++差分数组与前缀和优化实现
好的,这是一个典型的**区间修改 + 区间查询**的问题。 由于 n 和 q 可能达到接近 100,直接用暴力遍历每个区间进行累加是可以的,但如果数据量更大(比如 10^5)就会超时。 这里我会先给出一个**简单暴力法**(适合题目 n<100),再给出一个**差分 + 前缀和**的优化方法,适合更大的数据范围。 --- ## 🟢 暴力法(直接模拟) 直接开一个数组,对于每一轮浇水,遍历 L 到 R,累加 x。 ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, q; cin >> n >> q; vector<int> flowers(n + 1, 0); // 从1开始编号 for (int i = 0; i < q; i++) { int L, R, x; cin >> L >> R >> x; for (int j = L; j <= R; j++) { flowers[j] += x; } } int b, y; cin >> b >> y; long long sum = 0; for (int i = b; i <= y; i++) { sum += flowers[i]; } cout << sum << endl; return 0; } ``` **时间复杂度**:O(q * n) **空间复杂度**:O(n) --- ## 🔵 优化法:差分 + 前缀和(推荐) 差分数组 `diff[i]` 表示 `flowers[i] - flowers[i-1]` 的差值。 对于区间 [L, R] 增加 x,只需要: - diff[L] += x - diff[R+1] -= x 最后通过前缀和还原出每个位置的浇水次数,再对查询区间求一次前缀和即可。 ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, q; cin >> n >> q; vector<long long> diff(n + 2, 0); // 差分数组,多开一位防越界 for (int i = 0; i < q; i++) { int L, R, x; cin >> L >> R >> x; diff[L] += x; diff[R + 1] -= x; } // 还原每个花的浇水次数 vector<long long> flowers(n + 1, 0); for (int i = 1; i <= n; i++) { flowers[i] = flowers[i - 1] + diff[i]; } // 计算前缀和,便于区间查询 vector<long long> prefix(n + 1, 0); for (int i = 1; i <= n; i++) { prefix[i] = prefix[i - 1] + flowers[i]; } int b, y; cin >> b >> y; cout << prefix[y] - prefix[b - 1] << endl; return 0; } ``` **时间复杂度**:O(n + q) **空间复杂度**:O(n) --- ## 📌 开发注意要点 - 数组下标从1开始,避免边界判断混乱。 - 差分数组要多开一位,防止 R+1 越界。 - 如果 n 和 q 较大(比如 10^5),必须使用差分 + 前缀和,否则会超时。 - 使用 `long long` 存储浇水次数和,避免整数溢出。 - 对于多次区间查询,可以进一步使用线段树或树状数组,但本题只需一次查询,前缀和即可。 ######[AI问答 | 813点数解答 | 2026-06-21 19:35:43]
- Python实现:随机录入45位学生四次成绩函数大揭秘(GPT | 477点数解答 | 2024-12-17 17:00:35)390
- Python实现班级45位同学成绩生成、总评计算及分数统计(字节豆包 | 579点数解答 | 2024-12-21 11:55:01)279
- Python实现45位学生四次成绩随机录入及输出(GPT | 441点数解答 | 2024-12-21 21:02:22)283
- Python实战:45位同学成绩生成、总评计算与分数统计揭秘(字节豆包 | 688点数解答 | 2024-12-22 10:14:17)272
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)474
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)53
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)380
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)310
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)100
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)105
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)80
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)408