Skip to content

Commit b64cef1

Browse files
committed
add abc364
1 parent fb6870d commit b64cef1

File tree

3 files changed

+21
-17
lines changed

3 files changed

+21
-17
lines changed

docs/algorithm/AtCoder/abc364.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
???+ Abstract "题目大意"
44

5-
有 $N$ 道菜,第 $i$ 道菜可能是 `sweet` 或者 `salty`。你将按顺序品尝这些菜,如果你吃了连续 $2$ 道 `sweet` 的菜,后面的菜就不会再吃了。问:能否按顺序吃完所有菜?
5+
有 $N$ 道菜,第 $i$ 道菜可能是 `sweet` 或者 `salty`。你将按顺序品尝这些菜,如果你吃了连续 $2$ 道 `sweet` 的菜,后面的菜就不会再吃了。问:能否按顺序吃完所有菜?
66

77
??? Success "参考代码"
88

@@ -38,9 +38,9 @@
3838

3939
???+ Abstract "题目大意"
4040

41-
有一个 $H \times W$ 的二维矩阵,矩阵中每个位置可能是 `.` 代表空地,也可能是 `#` 代表障碍物。有一个机器人初始时站在 $(S_i, S_j)$ 上,随后,机器人会接到一个串指令,指令是一个由 `L``R``U``D` (分别代表上、下、左、右)组成的一个字符串。机器人会依次读取指令中的字符。例如,如果接收到 `L` 指令,机器人会“尝试”往左移动一步,如果左侧是障碍物,或者往左移动会超出矩阵的边界,则机器人不会跳过这条指令。
41+
有一个 $H \times W$ 的二维矩阵,矩阵中每个位置可能是 `.` 代表空地,也可能是 `#` 代表障碍物。有一个机器人初始时站在 $(S_i, S_j)$ 上,随后,机器人会接到一个串指令,指令是一个由 `L`, `R`,`U`,`D` (分别代表上、下、左、右)组成的一个字符串。机器人会依次读取指令中的字符。例如,如果接收到 `L` 指令,机器人会“尝试”往左移动一步,如果左侧是障碍物,或者往左移动会超出矩阵的边界,则机器人不会跳过这条指令。
4242

43-
问:当机器人执行所有指令之后,机器人的最终位置是?
43+
问:当机器人执行所有指令之后,机器人的最终位置是?
4444

4545
??? Success "参考代码"
4646

@@ -102,11 +102,11 @@
102102

103103
???+ Abstract "题目大意"
104104

105-
有 $N(1 \le N \le 2 \times 10 ^5)$ 道菜,第 $i$ 道菜的甜度是 $A_i$,咸度是 $B_i$。这 $N$ 道菜有可能以任意上菜顺序端上来,你将按照上菜顺序依次品尝这些菜。当你品尝的菜的总甜度超过 $X$,或者总咸度超过 $Y$ 时,后面的菜就不会再吃了。问:在所有可能的上菜顺序中,**最少** 能吃多少道菜?
105+
有 $N(1 \le N \le 2 \times 10 ^5)$ 道菜,第 $i$ 道菜的甜度是 $A_i$,咸度是 $B_i$。这 $N$ 道菜有可能以任意上菜顺序端上来,你将按照上菜顺序依次品尝这些菜。当你品尝的菜的总甜度超过 $X$,或者总咸度超过 $Y$ 时,后面的菜就不会再吃了。问:在所有可能的上菜顺序中,**最少** 能吃多少道菜?
106106

107107
??? Note "解题思路"
108108

109-
只有两种可能:要么甜度超标,要么咸度超标。对所有的 $A_i$ 排序统计一个答案,然后对 $B_i$ 排序统计一个答案,两个答案取最小值即可。
109+
只有两种可能:要么甜度超标,要么咸度超标。对所有的 $A_i$ 排序统计一个答案,然后对 $B_i$ 排序统计一个答案,两个答案取最小值即可。
110110

111111
??? Success "参考代码"
112112

@@ -163,11 +163,11 @@
163163

164164
???+ Abstract "题目大意"
165165

166-
在数轴上有 $N(1 \le N \le 10 ^ 5)$ 个点,第 $i$ 个点的位置是 $a_i$。给你 $Q(1 \le Q \le 10 ^ 5)$ 个询问,每个询问给你两个数字 $b_i$ 和 $k_i$,你需要回答出在数轴的 $N$ 个点中,和 $b_i$ 距离第 $k_i$ 近的点是哪个?
166+
在数轴上有 $N(1 \le N \le 10 ^ 5)$ 个点,第 $i$ 个点的位置是 $a_i$。给你 $Q(1 \le Q \le 10 ^ 5)$ 个询问,每个询问给你两个数字 $b_i$ 和 $k_i$,你需要回答出在数轴的 $N$ 个点中,和 $b_i$ 距离第 $k_i$ 近的点是哪个?
167167

168168
??? Note "解题思路"
169169

170-
对 $a_i$ 排序,然后对于每一个询问,直接二分距离 $x$,查询 $b_i - x$ 和 $b_i + x$ 在所有 $a_i$ 中的排名,判断是否大于等于 $k_i$ 即可。
170+
对 $a_i$ 排序,然后对于每一个询问,直接二分距离 $x$,查询 $b_i - x$ 和 $b_i + x$ 在所有 $a_i$ 中的排名,判断是否大于等于 $k_i$ 即可。
171171

172172
??? Success "参考代码"
173173

@@ -221,13 +221,13 @@
221221

222222
???+ Abstract "题目大意"
223223

224-
有 $N(1 \le N \le 80)$ 道菜,第 $i$ 道菜的甜度是 $A_i(1 \le A_i \le 10000)$,咸度是 $B_i(1 \le B_i \le 10000)$。这 $N$ 道菜有可能以任意上菜顺序端上来,你将按照上菜顺序依次品尝这些菜。当你品尝的菜的总甜度超过 $X(1 \le X \le 10000)$,或者总咸度超过 $Y(1 \le Y \le 10000)$ 时,后面的菜就不会再吃了。问:在所有可能的上菜顺序中,**最多** 能吃多少道菜?
224+
有 $N(1 \le N \le 80)$ 道菜,第 $i$ 道菜的甜度是 $A_i(1 \le A_i \le 10000)$,咸度是 $B_i(1 \le B_i \le 10000)$。这 $N$ 道菜有可能以任意上菜顺序端上来,你将按照上菜顺序依次品尝这些菜。当你品尝的菜的总甜度超过 $X(1 \le X \le 10000)$,或者总咸度超过 $Y(1 \le Y \le 10000)$ 时,后面的菜就不会再吃了。问:在所有可能的上菜顺序中,**最多** 能吃多少道菜?
225225

226226
??? Note "解题思路"
227227

228-
可以很容易想到背包 dp,定义 $dp[i][j][k]$ 表示前 $i$ 道菜中选出甜度不超过 $j$ 且咸度不超过 $k$ 的所有方案中,最多能选多少道菜。这样的话 dp 的时间复杂度是 $O(NXY)$,是会超时的。
228+
可以很容易想到背包 dp,定义 $dp[i][j][k]$ 表示前 $i$ 道菜中选出甜度不超过 $j$ 且咸度不超过 $k$ 的所有方案中,最多能选多少道菜。这样的话 dp 的时间复杂度是 $O(NXY)$,是会超时的。
229229

230-
考虑类似超大背包问题中的做法,转换 dp 表达式的顺序,定义 $dp[i][j][k]$ 表示从前 $i$ 到菜中选出 $j$ 到菜,且这 $j$ 道菜的甜度之和是 $k$ 的所有方案中,咸度的最小值。如果 $dp[i][j][k] \le Y$,表示这就是一个合法的方案,这样的话,dp 的时间复杂度就是 $O(N^2X)$。
230+
考虑类似超大背包问题中的做法,转换 dp 表达式的顺序,定义 $dp[i][j][k]$ 表示从前 $i$ 到菜中选出 $j$ 到菜,且这 $j$ 道菜的甜度之和是 $k$ 的所有方案中,咸度的最小值。如果 $dp[i][j][k] \le Y$,表示这就是一个合法的方案,这样的话,dp 的时间复杂度就是 $O(N^2X)$。
231231

232232
??? Success "参考代码"
233233

@@ -273,17 +273,17 @@
273273

274274
???+ Abstract "题目大意"
275275

276-
给你一个 $N+Q$ 个点的无向图,其中 $1 \le N, Q \le 2 \times 10 ^ 5$,图中点的编号为 $1, 2, \cdots, N+Q$。 图中有 $Q$ 种类型的边,每种类型可用 $L_i$,$R_i$ 和 $C_i$ 三个参数来描述,其中 $1 \le L_i \le R_i \le N$,表示:
276+
给你一个 $N+Q$ 个点的无向图,其中 $1 \le N, Q \le 2 \times 10 ^ 5$,图中点的编号为 $1, 2, \cdots, N+Q$。 图中有 $Q$ 种类型的边,每种类型可用 $L_i$,$R_i$ 和 $C_i$ 三个参数来描述,其中 $1 \le L_i \le R_i \le N$,表示:
277277

278-
- 对于所有的 $j = L_i, L_i+1, \cdots, R_i$,点 $j$ 到点 $N+i$ 有一条边权为 $C_i$ 的连边。
278+
- 对于所有的 $j = L_i, L_i+1, \cdots, R_i$,点 $j$ 到点 $N+i$ 有一条边权为 $C_i$ 的连边。
279279

280-
问:这个图是否是一个连通图?如果是,求出这个图的最小生成树。否则输出 `-1`
280+
问:这个图是否是一个连通图?如果是,求出这个图的最小生成树。否则输出 `-1`。
281281

282282
??? Note "解题思路"
283283

284-
可以发现,这个图是一个二分图,左侧的点集为 $[1, N]$,右侧点集为 $[N+1, N+Q]$,接下来考虑如何构造最小生成树。如果暴力的用 Kruskal 算法一个个家变,那么每一种类型的边 $(L_i, R_i, C_i)$,都要遍历其中的 $N$ 个点不断的判断能否加边,这样时间复杂度达到 $O(NQ)$,这是不行的,必须优化这个加边的过程。
284+
可以发现,这个图是一个二分图,左侧的点集为 $[1, N]$,右侧点集为 $[N+1, N+Q]$,接下来考虑如何构造最小生成树。如果暴力的用 Kruskal 算法一个个家变,那么每一种类型的边 $(L_i, R_i, C_i)$,都要遍历其中的 $N$ 个点不断的判断能否加边,这样时间复杂度达到 $O(NQ)$,这是不行的,必须优化这个加边的过程。
285285

286-
进一步我们会发现,如果对于 $[L_i, R_i]$,中间有一段 $[L, R]$ 已经连通了,对于这一段只需要有一个点和 $N + i$ 连接即可。于是我们可以把相邻的点都用并查集维护起来,遍历 $[L_i, R_i]$ 的时候按照连通块的最大值进入下一跳就可以了。
286+
进一步我们会发现,如果对于 $[L_i, R_i]$,中间有一段 $[L, R]$ 已经连通了,对于这一段只需要有一个点和 $N + i$ 连接即可。于是我们可以把相邻的点都用并查集维护起来,遍历 $[L_i, R_i]$ 的时候按照连通块的最大值进入下一跳就可以了。
287287

288288
??? Success "参考代码"
289289

docs/dev/db/15445/hash.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## 前言
22

3-
我曾在 [HashMap源码分析](../java/SourceCode/HashMap.md) 中分析过 `JAVA` 中哈希表的实现,`HashMap` 作为 `JDK` 的源码,其通用性自然不必多说,我曾一度认为 `JDK` 的方案非常完美,并且自己也用 C 实现过`JDK` 的哈希表。在我看来,`JDK``HashMap` 方案有以下优点:
3+
我曾在 [HashMap源码分析](../../java/SourceCode/HashMap.md) 中分析过 `JAVA` 中哈希表的实现,`HashMap` 作为 `JDK` 的源码,其通用性自然不必多说,我曾一度认为 `JDK` 的方案非常完美,并且自己也用 C 实现过`JDK` 的哈希表。在我看来,`JDK``HashMap` 方案有以下优点:
44

55
1. 同一个桶中,对于较长的链表,将其组织成红黑树。从数据结构的角度考虑,这是一个非常棒的设计,能够保证一定的查询速度,且红黑树在扩容时效率也比较高。
66

@@ -155,7 +155,7 @@
155155
</figure>
156156

157157

158-
本文一开始所提到的 `JDK``HashMap` 就是采用了这种方案,有关拉链法的更多细节,可以参照我的另一篇博客 [HashMap源码分析](../java/SourceCode/HashMap.md)
158+
本文一开始所提到的 `JDK``HashMap` 就是采用了这种方案,有关拉链法的更多细节,可以参照我的另一篇博客 [HashMap源码分析](../../java/SourceCode/HashMap.md)
159159

160160
`HashMap` 中针对链表较长的情况会将数据组织成链表,保证查询速度。下面讲讲使用布隆过滤器对哈希表进行优化,对于布隆过滤器的原理可以看看这个视频 [程序员都必须会的技术,面试必备【布隆过滤器详解】,Redis缓存穿透解决方案](https://www.bilibili.com/video/BV1zK4y1h7pA/?spm_id_from=333.337.search-card.all.click)
161161

mkdocs.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,17 @@ nav:
7575
exclude_docs: |
7676
/dev/cpp/
7777
/archive/missing-semester.md
78+
/essay/diary/2023*
79+
/essay/diary/2024-0*
7880
7981
# 会渲染但隐藏起来的页面 可以避免nav警告
8082
not_in_nav: |
8183
index.md
8284
/others/BJ_food_delete.md
8385
/others/Hongya_cave.md
8486
/algorithm/20240325.md
87+
/essay/diary/2023*
88+
/essay/diary/2024-0*
8589
8690
# [UI]
8791
## [top]

0 commit comments

Comments
 (0)