CSP 2023 题解
Junior
A
H2O 题目。每次计算出要拿走的苹果个数,直接减去就行了。
每次拿走的苹果个数是 $\frac{n}{3}$ 左右,因此时间复杂度为 $O(n \log_{3} n)$ 。
如何计算最后一个苹果什么时候被拿走?
设剩余个数为 last
, 易证第一次出现 last % 3 == 1
的时候最后一个苹果被拿走。
B
一眼贪心。
考虑自 $i$ 号点至第 $i + 1$ 号点 的路程,其燃油必由 $\min_{j=1}^{i}cost_j$ 提供。
直接 $O(n)$ 模拟加维护前缀最大值即可。
C
别人都告诉你怎么实现了。敲不出来就是语文老师的锅了。
注意几个实现细节:
-
$\frac{-b \pm \sqrt{\Delta}}{2a}$ 不一定是 $\frac{-b +\sqrt{\Delta}}{2a}$ 为最大的解。这取决于 $a$ 的正负。解决方案是,最后算出来后面的根号带的系数如果是负数,直接改成正的即可。不影响结果。
-
全是 $0$ 的情况要特判。不然会输出一个空行。
-
约分时用绝对值约分,不要直接用负数取模。
上面几点就是我考场上在这道题上花了接近 2h 的原因。
不过幸亏大样例够强。
我衷心希望 CCF 用心造样例,用脚造数据。
D
一眼多维(分层图)最短路。果果牛逼。
用 dis % k
作第二维。
可是边的开放时间怎么处理?
注意到答案具有二分性。若在 t
时刻可以到达终点,则 t + k
时刻也一定能到达终点。
于是二分答案即可。注意只用二分 k
的倍数。
那么 check
怎么写呢?
我们没办法知道确切的开始时间。
那不如直接在反图上跑一边 $n \to 1$ 的最短路?
恭喜你,正解。
Senior
死的太惨了。
不过要从悲伤中走出来。再努力一把,争取有机会和朋友们一起明年再战。
A
这就是所谓的大众分。
暴力枚举加 check
即可。
B
括!号!匹!配!
但是朴素栈算法是 $O(n ^ 2)$ 的,显然会超时。
注意到一个性质:如果两个位置的前缀单调栈形态相同,说明中间那一段可以完全消除,也就是一个符合要求的区间。
那么对栈的形态进行哈希, $O(n)$ 跑一遍括号匹配,再用 unordered_map
记录前缀个数即可。
严格线性的算法。比我考场上写的错误的线性 dp 牛逼多了。
C
大%拟。
主要是靠码力。
查询地址与对应名称的两种操作需要递归处理。
还有就是细节,例如结构体最后的结束位置要补齐到它的对齐标准的整数倍。
我两个小时码了 6000+b 。我自己都很震惊。
可惜考场上写的是 15 的部分分。
D
咕咕咕
本文作者:aaaaaaqqqqqq
本文链接:https://www.cnblogs.com/aaaaaaqqqqqq/p/17976954
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步