Atcoder Grand Contest 002(A~F)
这场打的还算舒服(虽然 DE 好像很久以前做过谔谔),VP 赛时切掉了 A~D,不过 E 依旧没写出来,还是太逊啦!
赛时
A 简单分类讨论,求 到 之间数的乘积,第一眼看成了和,痛失一次罚时。
B 很容易想到的一个结论是,如果一个盒子被混入可能含有红球的盒子内的球时,该盒子就可能会含有红球了。而当该盒子所有的球都被取走时,该盒子之前含有红球的可能就被清零了。
所以我们可以对每一个盒子维护一个标记,当混入有标记盒子内的球时,标记该盒子;当分出球后盒子为空时,将该盒子的标记删除。最后统计有标记盒子的个数即可。
C 开始想的一个结论是,最后肯定会剩下段数为 的绳子,而最短的相邻两段绳子最后切掉显然不优,所以不妨先将最短的相邻两段绳子从中间一分为二,免得最后因为长度太短切不成。
但是这样的贪心方式反例是很好举的,因为对于两个断点,先切和后切对于答案是有影响的,最短的相邻两段绳子最后切显然不优,但是先切也不一定优。正确的贪心也很好想,我们不妨找到最长的相邻两段绳子,先从最左侧向这个断点将中间的断点全部切掉,再从最右侧向这个断点切掉中间断点,最后切这两段绳子之间的断点,这样我们就能保证我们切的所有绳子一定比最长的相邻两段绳子长,而最长的相邻两段绳子一定是切割瓶颈中最大的一个。
于是我们找到长度和最长的相邻两段绳子,如果该长度和 ,则有解,否则无解。方案按照上述过程构造即可。
D 题一眼 Kruskal 重构树(绝对不是因为我很久以前做过而感到眼熟()。观察数据范围我们肯定是要在 log 相关的时间复杂度内处理单次询问的,所以我们需要预处理。贪心地来讲,设当前已经走过的点集为 ,未走过的点集为 ,则我们显然会找到从 指向 的一条边权最小的边走,并将走到的节点从 挪到 ——我们好像只会走最小生成树上的边!
换句话说,这就是一道 Kruskal 的板子题。不妨对于原图建立 Kruskal 重构树。对于每次询问,我们可以考虑二分答案 ,并从 和 开始向上跳,只要该二次幂父亲的权小于等于 就跳,最后如果 和 跳到相同节点,则我们可以走到的节点个数就是该节点子树内叶子结点的个数;否则就是 和 子树内叶子结点的个数之和。
其中叶子结点的个数和二次幂父亲显然可以通过预处理得到,于是这道题就做完了。
E 题大概想到了将 降序排序之后,每次操作就变成了取最下面一行或是取最左边一列,可以转化为一张网格图从左下角向上向右走,但是表没时间打了。
赛后
E 打完表会发现网格图从左下到右上的每一条对角线必胜必败态都是相同的,所以我们可以先找到以起点为左下角的最大正方形的右上角,该格点和起点的必胜必败态一定相同。
走到该格点后一定仍然该先手先走,此时先手有两种选择,向上走或者向右走,此时根据距离的奇偶性简单判断即可。还是很妙的题。
F 刚开始想到从后往前枚举位置放置白球,每放一个白球就可以考虑将一个颜色的球塞在这个白球的后面,开始先不管每个球的具体颜色,最后再算上给球分配具体颜色的方案数。时间复杂度有点高,大概是 ,显然过不去。
但事实上我们可以注意到一个性质:
对于最终颜色串的任意前缀,白球的数量一定大于等于其他球的颜色数。
根据这个性质,我们其实就可以从前到后 dp 了。可以设 表示当前放置了 个白球、 种其他颜色的所有球的方案数,其中 。
考虑如何转移。首先要解决的是去重的问题。所以我们需要规定放白球一定要放在当前的第一个空位上,放其他颜色的球时一定要在第一个空位上放一个球,其他球可以随便放,这样我们的方案就不会重复了。
转移有两种选择:放白球或者放其他颜色的球。对于前者,首先要保证放置白球之前状态合法,其次根据我们去重的原则,只能将白球放在第一个空位,所以直接由 转移过来即可;对于后者,我们首先要知道放置哪个颜色,这显然有 种可能,除此之外,我们在第一个空位上放置一个球之后,剩下的 个球会随意放置,而现在还剩下 个空位,求个组合数即可。总状态转移方程为:
初始状态为 ,目标状态为 ,需要注意转移顺序。
以及 时全是白球,需要特殊处理,答案为 。
如果以上的一切你都可以在赛时想到,你就可以 AK 远古 AGC 了!
简单总结一下 F 吧。把题目模型抽象一下,其实白球就类似于括号序列中的左括号,其他颜色的球就类似于右括号,而我们其实也是在作一个匹配括号的过程。所以不妨用状态将当前左右括号的数量记录下来进行转移。难点在于去重。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?