前置知识 : 无,知道什么是数组就行
一维差分:太简单了,没有理解难度。不支持边操作、边查询。
等差数列差分问题描述: 一开始1~n范围上的数字都是0。接下来一共有m个操作。 每次操作:l~r范围上依次加上首项s、末项e、公差d的数列 最终1~n范围上的每个数字都要正确得到
等差数列差分的过程: 每个操作调用set方法 所有操作完成后在arr上生成两遍前缀和,即调用build方法 arr里就是最终1~n范围上的每个数字
注意: 等差数列差分在大厂笔试、面试中还不常见,是比赛必备技巧,但预计会流行 二维差分会在后续的【必备】课程里进一步讲述,支持边操作、边查询的结构会在【扩展】课程讲述
void set(int l, int r, int s, int e, int d) {
arr[l] += s;
arr[l + 1] += d - s;
arr[r + 1] -= d + e;
arr[r + 2] += e;
}
void build() {
for (int i = 1; i <= n; i++) {
arr[i] += arr[i - 1];
}
for (int i = 1; i <= n; i++) {
arr[i] += arr[i - 1];
}
}
题目1 航班预订统计 这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings , 表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti 包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。 请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。
题目2 等差数列差分模版 一开始1~n范围上的数字都是0,一共有m个操作,每次操作为(l,r,s,e,d) 表示在l~r范围上依次加上首项为s、末项为e、公差为d的数列 M个操作做完之后,统计1~n范围上所有数字的最大值和异或和 1 <= n <= 10^7 1 <= m <= 3 * 10^5 1 <= l <= r <= n
P4231 【二阶差分】三步必杀 https://www.luogu.com.cn/problem/solution/P4231
题目3 等差数列差分经典题目 一群人落水后求每个位置的水位高度 问题描述比较复杂,见测试链接 测试链接 : https://www.luogu.com.cn/problem/P5026
注意:这道题OFFSET的设计,可以避免大量的边界讨论
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com