File tree 7 files changed +199
-7
lines changed
7 files changed +199
-7
lines changed Original file line number Diff line number Diff line change
1
+ | 题目 | 题解 | 难度 | 推荐指数 |
2
+ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---- | -------- |
3
+ | [ 933. 最近的请求次数] ( https://leetcode-cn.com/problems/number-of-recent-calls/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/number-of-recent-calls/solution/by-ac_oier-evqe/ ) | 简单 | 🤩🤩🤩🤩🤩 |
4
+
Original file line number Diff line number Diff line change 4
4
| [ 729. 我的日程安排表 I] ( https://leetcode-cn.com/problems/my-calendar-i/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/my-calendar-i/solution/by-ac_oier-1znx/ ) | 中等 | 🤩🤩🤩🤩🤩 |
5
5
| [ 731. 我的日程安排表 II] ( https://leetcode-cn.com/problems/my-calendar-ii/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/my-calendar-ii/solution/by-ac_oier-okkc/ ) | 中等 | 🤩🤩🤩🤩🤩 |
6
6
| [ 732. 我的日程安排表 III] ( https://leetcode-cn.com/problems/my-calendar-iii/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/my-calendar-iii/solution/by-ac_oier-cv31/ ) | 困难 | 🤩🤩🤩🤩🤩 |
7
+ | [ 933. 最近的请求次数] ( https://leetcode-cn.com/problems/number-of-recent-calls/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/number-of-recent-calls/solution/by-ac_oier-evqe/ ) | 简单 | 🤩🤩🤩🤩🤩 |
7
8
| [ 1109. 航班预订统计] ( https://leetcode-cn.com/problems/corporate-flight-bookings/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/corporate-flight-bookings/solution/gong-shui-san-xie-yi-ti-shuang-jie-chai-fm1ef/ ) | 中等 | 🤩🤩🤩🤩🤩 |
8
9
| [ 1893. 检查是否区域内所有整数都被覆盖] ( https://leetcode-cn.com/problems/check-if-all-the-integers-in-a-range-are-covered/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/check-if-all-the-integers-in-a-range-are-covered/solution/gong-shui-san-xie-yi-ti-shuang-jie-mo-ni-j83x/ ) | 简单 | 🤩🤩🤩🤩 |
9
10
| [ 2213. 由单个字符重复的最长子字符串] ( https://leetcode-cn.com/problems/longest-substring-of-one-repeating-character/ ) | [ LeetCode 题解链接] ( https://leetcode-cn.com/problems/longest-substring-of-one-repeating-character/solution/by-ac_oier-0lso/ ) | 困难 | 🤩🤩🤩🤩🤩 |
File renamed without changes.
Original file line number Diff line number Diff line change @@ -98,9 +98,9 @@ class MyCalendar {
98
98
99
99
但对于本题而言,由于「强制在线」的原因,我们无法进行「离散化」,同时值域大小达到 $1e9$ 级别,因此如果我们想要使用「线段树」进行求解,只能采取「动态开点」的方式进行。
100
100
101
- 动态开点的优势在于,不需要事前构造空树,而是在插入操作 ` add ` 和查询操作 ` query ` 时根据访问需要进行「开点」操作。由于我们不保证查询和插入都是连续的,因此对于父节点 $u$ 而言,我们不能通过 ` u << 1 ` 和 ` u << 1 | 1 ` 的固定方式进行访问,而要将节点 $tr[ u] $ 的左右节点所在 ` tr ` 数组的下标进行存储,分别记为 ` ls ` 和 ` rs ` 属性。对于 $tr[ u] .ls = 0$ 和 $tr[ u] .rs = 0$ 则是代表子节点尚未被创建,当需要访问到它们,而又尚未创建的时候,则将其进行创建。
101
+ 动态开点的优势在于,不需要事前构造空树,而是在插入操作 ` update ` 和查询操作 ` query ` 时根据访问需要进行「开点」操作。由于我们不保证查询和插入都是连续的,因此对于父节点 $u$ 而言,我们不能通过 ` u << 1 ` 和 ` u << 1 | 1 ` 的固定方式进行访问,而要将节点 $tr[ u] $ 的左右节点所在 ` tr ` 数组的下标进行存储,分别记为 ` ls ` 和 ` rs ` 属性。对于 $tr[ u] .ls = 0$ 和 $tr[ u] .rs = 0$ 则是代表子节点尚未被创建,当需要访问到它们,而又尚未创建的时候,则将其进行创建。
102
102
103
- 由于存在「懒标记」,线段树的插入和查询都是 $\log{n}$ 的,因此我们在单次操作的时候,最多会创建数量级为 $\log{n}$ 的点,因此空间复杂度为 $O(m\log{n})$,而不是 $O(4 * n)$,而开点数的预估需不能仅仅根据 $\log{n}$ 来进行,还要对常熟进行分析 ,才能得到准确的点数上界。
103
+ 由于存在「懒标记」,线段树的插入和查询都是 $\log{n}$ 的,因此我们在单次操作的时候,最多会创建数量级为 $\log{n}$ 的点,因此空间复杂度为 $O(m\log{n})$,而不是 $O(4 * n)$,而开点数的预估需不能仅仅根据 $\log{n}$ 来进行,还要对常数进行分析 ,才能得到准确的点数上界。
104
104
105
105
动态开点相比于原始的线段树实现,本质仍是使用「满二叉树」的形式进行存储,只不过是按需创建区间,如果我们是按照连续段进行查询或插入,最坏情况下仍然会占到 $4 * n$ 的空间,因此盲猜 $\log{n}$ 的常数在 $4$ 左右,保守一点可以直接估算到 $6$,因此我们可以估算点数为 $6 * m * \log{n}$,其中 $n = 1e9$ 和 $m = 1e3$ 分别代表值域大小和查询次数。
106
106
@@ -152,7 +152,7 @@ class MyCalendar {
152
152
}
153
153
void pushdown (int u , int len ) {
154
154
tr[tr[u]. ls]. add += tr[u]. add; tr[tr[u]. rs]. add += tr[u]. add;
155
- tr[tr[u]. ls]. val += len / 2 * tr[u]. add; tr[tr[u]. rs]. val += ( len - len / 2 ) * tr[u]. add;
155
+ tr[tr[u]. ls]. val += len / 2 * tr[u]. add; tr[tr[u]. rs]. val += len / 2 * tr[u]. add;
156
156
tr[u]. add = 0 ;
157
157
}
158
158
void pushup (int u ) {
Original file line number Diff line number Diff line change @@ -56,9 +56,9 @@ MyCalendar.book(25, 55); // returns true
56
56
57
57
但对于本题而言,由于「强制在线」的原因,我们无法进行「离散化」,同时值域大小达到 $1e9$ 级别,因此如果我们想要使用「线段树」进行求解,只能采取「动态开点」的方式进行。
58
58
59
- 动态开点的优势在于,不需要事前构造空树,而是在插入操作 ` add ` 和查询操作 ` query ` 时根据访问需要进行「开点」操作。由于我们不保证查询和插入都是连续的,因此对于父节点 $u$ 而言,我们不能通过 ` u << 1 ` 和 ` u << 1 | 1 ` 的固定方式进行访问,而要将节点 $tr[ u] $ 的左右节点所在 ` tr ` 数组的下标进行存储,分别记为 ` ls ` 和 ` rs ` 属性。对于 $tr[ u] .ls = 0$ 和 $tr[ u] .rs = 0$ 则是代表子节点尚未被创建,当需要访问到它们,而又尚未创建的时候,则将其进行创建。
59
+ 动态开点的优势在于,不需要事前构造空树,而是在插入操作 ` update ` 和查询操作 ` query ` 时根据访问需要进行「开点」操作。由于我们不保证查询和插入都是连续的,因此对于父节点 $u$ 而言,我们不能通过 ` u << 1 ` 和 ` u << 1 | 1 ` 的固定方式进行访问,而要将节点 $tr[ u] $ 的左右节点所在 ` tr ` 数组的下标进行存储,分别记为 ` ls ` 和 ` rs ` 属性。对于 $tr[ u] .ls = 0$ 和 $tr[ u] .rs = 0$ 则是代表子节点尚未被创建,当需要访问到它们,而又尚未创建的时候,则将其进行创建。
60
60
61
- 由于存在「懒标记」,线段树的插入和查询都是 $\log{n}$ 的,因此我们在单次操作的时候,最多会创建数量级为 $\log{n}$ 的点,因此空间复杂度为 $O(m\log{n})$,而不是 $O(4 * n)$,而开点数的预估需不能仅仅根据 $\log{n}$ 来进行,还要对常熟进行分析 ,才能得到准确的点数上界。
61
+ 由于存在「懒标记」,线段树的插入和查询都是 $\log{n}$ 的,因此我们在单次操作的时候,最多会创建数量级为 $\log{n}$ 的点,因此空间复杂度为 $O(m\log{n})$,而不是 $O(4 * n)$,而开点数的预估需不能仅仅根据 $\log{n}$ 来进行,还要对常数进行分析 ,才能得到准确的点数上界。
62
62
63
63
动态开点相比于原始的线段树实现,本质仍是使用「满二叉树」的形式进行存储,只不过是按需创建区间,如果我们是按照连续段进行查询或插入,最坏情况下仍然会占到 $4 * n$ 的空间,因此盲猜 $\log{n}$ 的常数在 $4$ 左右,保守一点可以直接估算到 $6$,因此我们可以估算点数为 $6 * m * \log{n}$,其中 $n = 1e9$ 和 $m = 1e3$ 分别代表值域大小和查询次数。
64
64
Original file line number Diff line number Diff line change @@ -56,9 +56,9 @@ myCalendarThree.book(25, 55); // 返回 3
56
56
57
57
但对于本题而言,由于「强制在线」的原因,我们无法进行「离散化」,同时值域大小达到 $1e9$ 级别,因此如果我们想要使用「线段树」进行求解,只能采取「动态开点」的方式进行。
58
58
59
- 动态开点的优势在于,不需要事前构造空树,而是在插入操作 ` add ` 和查询操作 ` query ` 时根据访问需要进行「开点」操作。由于我们不保证查询和插入都是连续的,因此对于父节点 $u$ 而言,我们不能通过 ` u << 1 ` 和 ` u << 1 | 1 ` 的固定方式进行访问,而要将节点 $tr[ u] $ 的左右节点所在 ` tr ` 数组的下标进行存储,分别记为 ` ls ` 和 ` rs ` 属性。对于 $tr[ u] .ls = 0$ 和 $tr[ u] .rs = 0$ 则是代表子节点尚未被创建,当需要访问到它们,而又尚未创建的时候,则将其进行创建。
59
+ 动态开点的优势在于,不需要事前构造空树,而是在插入操作 ` update ` 和查询操作 ` query ` 时根据访问需要进行「开点」操作。由于我们不保证查询和插入都是连续的,因此对于父节点 $u$ 而言,我们不能通过 ` u << 1 ` 和 ` u << 1 | 1 ` 的固定方式进行访问,而要将节点 $tr[ u] $ 的左右节点所在 ` tr ` 数组的下标进行存储,分别记为 ` ls ` 和 ` rs ` 属性。对于 $tr[ u] .ls = 0$ 和 $tr[ u] .rs = 0$ 则是代表子节点尚未被创建,当需要访问到它们,而又尚未创建的时候,则将其进行创建。
60
60
61
- 由于存在「懒标记」,线段树的插入和查询都是 $\log{n}$ 的,因此我们在单次操作的时候,最多会创建数量级为 $\log{n}$ 的点,因此空间复杂度为 $O(m\log{n})$,而不是 $O(4 * n)$,而开点数的预估需不能仅仅根据 $\log{n}$ 来进行,还要对常熟进行分析 ,才能得到准确的点数上界。
61
+ 由于存在「懒标记」,线段树的插入和查询都是 $\log{n}$ 的,因此我们在单次操作的时候,最多会创建数量级为 $\log{n}$ 的点,因此空间复杂度为 $O(m\log{n})$,而不是 $O(4 * n)$,而开点数的预估需不能仅仅根据 $\log{n}$ 来进行,还要对常数进行分析 ,才能得到准确的点数上界。
62
62
63
63
动态开点相比于原始的线段树实现,本质仍是使用「满二叉树」的形式进行存储,只不过是按需创建区间,如果我们是按照连续段进行查询或插入,最坏情况下仍然会占到 $4 * n$ 的空间,因此盲猜 $\log{n}$ 的常数在 $4$ 左右,保守一点可以直接估算到 $6$,因此我们可以估算点数为 $6 * m * \log{n}$,其中 $n = 1e9$ 和 $m = 1e3$ 分别代表值域大小和查询次数。
64
64
You can’t perform that action at this time.
0 commit comments