差分数组,轻松求解连续区域最大干净度
这是一个典型的**差分数组 + 前缀和**问题。 因为 n 最大为 99,q 也没有明确上限但根据数据范围可以允许 q 较大,直接模拟区间加会超时(O(n*q)),使用差分可以优化到 **O(n+q)**。 ### 🧠 解题思路 1. **差分数组**: - 每次对区间 [Li, Ri] 加 xi 时,在位置 Li 加上 xi,在位置 Ri+1 减去 xi。 - 最后对整个数组做一次前缀和,就得到每个区域最终的干净度。 2. **找最大值**: - 遍历一遍前缀和结果,记录最大值。 ### 📝 代码实现(C++) ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, q; cin >> n >> q; // 差分数组,长度为 n+2 防止越界 vector<int> 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; } int current = 0; int maxClean = 0; for (int i = 1; i <= n; i++) { current += diff[i]; if (current > maxClean) { maxClean = current; } } cout << maxClean << endl; return 0; } ``` ### 🧪 样例验证 输入: ``` 5 4 1 3 1 2 4 1 3 5 1 5 5 1 ``` 差分过程: - 初始 diff: `[0,0,0,0,0,0,0]` - 第1次: diff[1]+=1, diff[4]-=1 → diff: `[0,1,0,0,-1,0,0]` - 第2次: diff[2]+=1, diff[5]-=1 → diff: `[0,1,1,0,-1,-1,0]` - 第3次: diff[3]+=1, diff[6]-=1 → diff: `[0,1,1,1,-1,-1,-1]` - 第4次: diff[5]+=1, diff[6]-=1 → diff: `[0,1,1,1,-1,0,-2]` 前缀和: - i=1: 1 - i=2: 2 - i=3: 3 - i=4: 2 - i=5: 2 最大值:3 ✅ ######[AI问答 | 632点数解答 | 2026-06-06 14:38:20]
- 深入解析洛谷打卡系统:规则揭秘与代码实现(字节豆包 | 316点数解答 | 2025-11-16 19:45:59)145
- 高考毕业晚会难题:从学生能力值求最大默契程度的Python解法(字节豆包 | 487点数解答 | 2026-01-24 13:10:18)69
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)44
- JavaScript开发:为何 React 的 useState 用数组而非对象?优势揭秘!(阿里通义 | 202点数解答 | 2023-11-09 01:54:01)305
- C#工程师必知:数组、链表、哈希、队列、栈数据结构优缺点大揭秘! (百度文心 | 561点数解答 | 2023-11-09 17:56:30)284
- 补全代码:精准判断变量 a 是否为数组类型( | 115点数解答 | 2024-05-20 21:58:29)346
- Java 实现:从数组提取姓名并匹配同姓人员信息与数量(字节豆包 | 333点数解答 | 2024-09-10 11:58:36)215
- JS实现数组 ['0', '3'] 到多种格式字符串转换全攻略(百度文心 | 511点数解答 | 2024-10-15 11:05:43)200
- 查询学生分数:C++实现及注意要点(阿里通义 | 376点数解答 | 2024-12-05 19:07:36)244
- 查询学生分数:代码实现、逻辑要点与错误处理揭秘(阿里通义 | 227点数解答 | 2024-12-05 19:08:09)265
- C++实现:从键盘输入学生分数并按学号精准查询,附代码与逻辑要点!(阿里通义 | 188点数解答 | 2024-12-05 19:08:45)578
- C++实现:查询童程童美班级学生成绩,附代码与逻辑要点 (阿里通义 | 228点数解答 | 2024-12-05 19:24:38)275