CSP-S 2022 复赛题解
退役选手口胡 /oh /oh /oh,有问题敬请指出
假期计划(holiday)
首先进行 次 BFS 预处理出 ,表示两两之间的最少中转点个数(最短路)。
直觉告诉我们应该枚举 。那么 能不能 步到达直接利用 来判断即可。接下来考虑对于已经确定的 ,应该如何选择合理的 。
和 应该是完全等价的,这里不妨考虑前者。如果不考虑“点不重复”的限制,那么 应该是所有满足 且 的点中权值最大的。预处理这个最优的决策点为 。同理预处理出次优点、次次优点,分别记为 、。
那么,在枚举 之后,调用所有 组 和 ,判断合法性(是否重复)并计算权值最大的方案即可。显然这 种方案里必然存在一种方案是四个点互不相同的。
最短路、预处理、计算答案的时间复杂度均为 。
策略游戏(game)
首先分析当先手已经把 选定时,后手应该怎么选择 去使得答案最小:
- 能取异号的,那必然选异号的,而且要取绝对值最大的那个;
- 没有异号的,考虑取 ;
- 如果只能取同号的,那么一定取绝对值最小的那个。
总结一下以上几条策略,发现需要用到的量包括:区间内「负数」「正数」的“最大”和“最小”值以及「」。在这样的情形下,考虑先手应该如何应对,不难发现,先手要取的数也必然是以上几种之一。
因此,使用线段树 / ST 表维护区间的以上几种信息。对于一次询问,先查询到 和 的这 5 个信息后,依次枚举先手决策、后手决策,对每个先手决策取最小值的最大值即是答案。
时间复杂度 。
星战(galaxy)
先把题面要求的东西翻译成人话:有一些删边、加边操作,查询是不是每个点的出度都恰好为 (因为如果每个点都有出度的话,必然可以永远地走下去)。
既然如此,考虑维护每个点的出度。设集合 表示目前存在的所有边的起点构成的可重集,那么,答案是 YES
当且仅当 。这里只需要判断集合是否相等,可以采用维护哈希值的方法,比如维护集合内元素的一次方和、二次方和、异或和之类的,看看两边是不是相同。
问题转化为了,在题目给定的加边、删边的条件下,动态维护 的一些哈希值 。对于只有单点加、删,可以直接对哈希值 进行修改。对于带有加、删以一个点 为终点的所有边的时候情形稍复杂,可以预处理 表示 的所有入边对应起点的哈希值(比如一次方和、二次方和、异或和),动态维护 表示当前时刻 存在的所有入边对应起点的哈希值,以此来辅助更新。比如 如果设定为一次方和,那么此时对 进行第四类修复即可以表示为 、。其他同理。
时间复杂度 。
数据传输(transmit)
的时候直接退化为求带权距离,再一来这是个静态问题,这启发我们使用树上倍增。
对于 ,考虑求 的答案的时候,把 之间的链按顺序写下来,记作 ,答案就应该是,选定其中的若干项,相邻两项之间的下标差不超过 ,然后求对应权值和的最小值。暴力做法可以是 dp,比如 表示最后一个当前落在 ,最小权值和,转移的时候往前枚举至多两项()来更新即可。
现在魔改这个东西变成树上倍增,用 ()表示考虑从 开始往上 个点构成的数列,从距离 为 的点走到距离 为 的点的答案。初始化为 。对每组 ,转移的时候 枚举跨越中线的一步是经过哪两个点来暴力合并,形式化来说就是 。然后类似求距离的方法,在 LCA 处也是 暴力合并计算答案。
而对于 ,上述做法可能会出现问题,具体表现为可以“折返”:
其实这个问题通过改变 的初始化方式就可以解决。除了初始化 为 之外,我们还额外地初始化 ()为距离 不超过 的点的 的最小值(可以通过递推实现)。回顾上述 的流程,发现所有的“折返”都被解决了。
时间复杂度 ,感觉有点卡?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探