5.1做题笔记
SunburstFan · · 个人记录
很久没有写做题笔记了,将这两个月做的一些个人认为比较有意义的题都复盘一下。
这里面的题目都不是模拟赛的题,模拟赛的题会再开一篇。
P12195 [NOISG 2025 Prelim] Itinerary
题目大意
有一个树和一个序列,要求按照给出的顺序访问序列中的所有点,问每个点能否作为起点。
解题思路
如果一个方案不合法,当且仅当沿着这个方案中相邻两个点的最短路遍历的时候有一条边被遍历了大于
考虑树链剖分,将相邻两点的最短路加入,对于从城市
时间复杂度
P11903 [NHSPC 2023] B. 人工智能模拟
题目大意
给定 01 字符串,要求构造一个长度为
- 与任一给出字符串不完全相同;
- 对任意选择的
t 个位置,能在所有字符串中找到一个在这t 个位置上的特征与所构造字符串完全一致;
另外,构造字符串中 1 的个数最多不超过
解题思路
搜索题。
由于 1,可枚举所有满足“最多 1”条件的字符串。
对于每个字符串
- 判断
S 是否与某个字符串T_i 相同,若相同则淘汰; - 使用 DFS 枚举从
k 个位置中挑选t 个位置的所有组合,对于每个组合检查是否存在至少一位受访者,其在这t 个位置上的特征值与S 完全匹配;
只要 none。
P11906 [NHSPC 2023] E. 迷宫钥匙圈
题目大意
给定一个由字母表示的迷宫面板,每一次将迷宫向左或向右旋转90度,所有还在迷宫内的小钢珠会按照特定规则“下落”——直到掉出迷宫、碰到挡板或碰到其它已停稳的小钢珠。求至少需要多少次旋转(仅允许左旋或右旋)才能使所有小钢珠都掉出迷宫。
解题思路
搜索题。
将迷宫看作二维矩阵,每次旋转分别实现左旋或右旋操作。 对于旋转后的矩阵,逐列模拟小钢珠的下落过程:
- 找到每个小钢珠下降路径中最先遇到的挡板,并根据该列已有的小钢珠数确定最终落点;
- 若该列没有挡板,则对应的小钢珠会掉出迷宫(状态中移除)。
将每一次旋转后的状态(迷宫中小钢珠的位置配置)作为一个状态节点,用 BFS 从初始状态开始搜索:
- 当某状态下迷宫中已无小钢珠时,即找到答案,输出所需旋转次数;
- 若遍历所有可能状态都无法清空小钢珠,则输出
-1 。
P11861 [CCC 2025 Senior] 写作业 / To-Do List
题目大意
维护一个待办任务列表,支持两种加密更新操作:
A s t:添加一个任务(发布时间s ,所需时间t )D x:删除第x 个加入的任务
每次更新后,求最早完成所有任务的时刻(任务必须按顺序连续完成)。
解题思路
利用线段树维护时间区间的累积值,支持区间加法更新。
对于每次任务添加或删除,通过更新相应区间来调整整体完成时间(即树根的最大值)。
每次操作均为
P11860 [CCC 2025 Senior] 熔岩路 / Floor is Lava
题目大意
你被困在一个有
解题思路
方案核心在于将问题转化为求一条路径上温度调整的最小成本。对于一条选定的路径,如果依次经过温度
考虑每个房间内相邻隧道的温度调整问题:
- 对于同一个房间,把所有出入该房间的隧道按温度排序,任意相邻两隧道间调整的花费即为它们温度之差。
- 从房间
1 出发,初始冷却等级为0 ,因此进入该房间的每条隧道的起始花费为隧道温度。 - 对于房间
n ,只需保证通过某条隧道到达即可。
因此,我们构造一个以隧道为“节点”的图,
- 对于每个房间,将该房间中排序后的隧道节点两两建立边,权值为温度差(双向边)。
- 接着,对于所有出自房间
1 的隧道,初始代价为它们各自的温度;对于所有经过房间n 的隧道,记录到达终点的代价。
最后,利用 Dijkstra 在该图上求最短路径,答案即为最低总调整花费。
该方法在构造边时对每个房间按隧道温度排序,所以整体时间复杂度为
AT_arc197_a 网格路径并
题目大意
给定一个 D、R 和 ?),其中
- 若
S_i = \text{D} ,第i 步只能向下走; - 若
S_i = \text{R} ,第i 步只能向右走; - 若
S_i = \text{?} ,第i 步可以自由选择(向下或向右)。
每次你可以按照
解题思路
一个合法路径必须走恰好
设字符串中固定的
个字符选为
定义
对于第
其中
和
此时,固定的
最终答案为所有前缀(
由于对每个前缀只作常数次运算,整体时间复杂度为
AT_arc197_b 大于均值
解题思路
-
首先对序列
A 排序,并计算其前缀和。
目标是选出一个子序列,其得分为大于子序列均值的元素数量最大。
定义得分为\sum_{i=1}^{|x|} \mathbf{1}\Bigl(x_i > \frac{\sum_{j=1}^{|x|} x_j}{|x|}\Bigr). -
对于每个可能的子序列长度
i ,累加排序后前i 个元素的和S = \sum_{j=1}^i A_j.
设固定的D 数量对应于被子序列舍弃的前缀个数k ,使得剩余部分全部大于平均值。
判断条件为A_k \cdot i > S, 并使用双指针寻找最小满足条件的k 。 -
最终得分即为最大值
\max_{1\le i\le N}(i - k),
其中i-k 表示选取长度为i 的子序列中大于均值的元素个数。
时间复杂度为O(N\log N).