|
2 | 2 |
|
3 | 3 | ???+ Abstract "题目大意"
|
4 | 4 |
|
5 |
| -有 $N$ 道菜,第 $i$ 道菜可能是 `sweet` 或者 `salty`。你将按顺序品尝这些菜,如果你吃了连续 $2$ 道 `sweet` 的菜,后面的菜就不会再吃了。问:能否按顺序吃完所有菜? |
| 5 | + 有 $N$ 道菜,第 $i$ 道菜可能是 `sweet` 或者 `salty`。你将按顺序品尝这些菜,如果你吃了连续 $2$ 道 `sweet` 的菜,后面的菜就不会再吃了。问:能否按顺序吃完所有菜? |
6 | 6 |
|
7 | 7 | ??? Success "参考代码"
|
8 | 8 |
|
|
38 | 38 |
|
39 | 39 | ???+ Abstract "题目大意"
|
40 | 40 |
|
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` 指令,机器人会“尝试”往左移动一步,如果左侧是障碍物,或者往左移动会超出矩阵的边界,则机器人不会跳过这条指令。 |
42 | 42 |
|
43 |
| -问:当机器人执行所有指令之后,机器人的最终位置是? |
| 43 | + 问:当机器人执行所有指令之后,机器人的最终位置是? |
44 | 44 |
|
45 | 45 | ??? Success "参考代码"
|
46 | 46 |
|
|
102 | 102 |
|
103 | 103 | ???+ Abstract "题目大意"
|
104 | 104 |
|
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$ 时,后面的菜就不会再吃了。问:在所有可能的上菜顺序中,**最少** 能吃多少道菜? |
106 | 106 |
|
107 | 107 | ??? Note "解题思路"
|
108 | 108 |
|
109 |
| -只有两种可能:要么甜度超标,要么咸度超标。对所有的 $A_i$ 排序统计一个答案,然后对 $B_i$ 排序统计一个答案,两个答案取最小值即可。 |
| 109 | + 只有两种可能:要么甜度超标,要么咸度超标。对所有的 $A_i$ 排序统计一个答案,然后对 $B_i$ 排序统计一个答案,两个答案取最小值即可。 |
110 | 110 |
|
111 | 111 | ??? Success "参考代码"
|
112 | 112 |
|
|
163 | 163 |
|
164 | 164 | ???+ Abstract "题目大意"
|
165 | 165 |
|
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$ 近的点是哪个? |
167 | 167 |
|
168 | 168 | ??? Note "解题思路"
|
169 | 169 |
|
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$ 即可。 |
171 | 171 |
|
172 | 172 | ??? Success "参考代码"
|
173 | 173 |
|
|
221 | 221 |
|
222 | 222 | ???+ Abstract "题目大意"
|
223 | 223 |
|
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)$ 时,后面的菜就不会再吃了。问:在所有可能的上菜顺序中,**最多** 能吃多少道菜? |
225 | 225 |
|
226 | 226 | ??? Note "解题思路"
|
227 | 227 |
|
228 |
| -可以很容易想到背包 dp,定义 $dp[i][j][k]$ 表示前 $i$ 道菜中选出甜度不超过 $j$ 且咸度不超过 $k$ 的所有方案中,最多能选多少道菜。这样的话 dp 的时间复杂度是 $O(NXY)$,是会超时的。 |
| 228 | + 可以很容易想到背包 dp,定义 $dp[i][j][k]$ 表示前 $i$ 道菜中选出甜度不超过 $j$ 且咸度不超过 $k$ 的所有方案中,最多能选多少道菜。这样的话 dp 的时间复杂度是 $O(NXY)$,是会超时的。 |
229 | 229 |
|
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)$。 |
231 | 231 |
|
232 | 232 | ??? Success "参考代码"
|
233 | 233 |
|
|
273 | 273 |
|
274 | 274 | ???+ Abstract "题目大意"
|
275 | 275 |
|
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$,表示: |
277 | 277 |
|
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$ 的连边。 |
279 | 279 |
|
280 |
| -问:这个图是否是一个连通图?如果是,求出这个图的最小生成树。否则输出 `-1`。 |
| 280 | + 问:这个图是否是一个连通图?如果是,求出这个图的最小生成树。否则输出 `-1`。 |
281 | 281 |
|
282 | 282 | ??? Note "解题思路"
|
283 | 283 |
|
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)$,这是不行的,必须优化这个加边的过程。 |
285 | 285 |
|
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]$ 的时候按照连通块的最大值进入下一跳就可以了。 |
287 | 287 |
|
288 | 288 | ??? Success "参考代码"
|
289 | 289 |
|
|
0 commit comments