Tsinghua Bootcamp 2025 预选赛部分题解
注意
题解写得可能非常抽象。
「如果一个题解你看不懂,那是题解垃圾而不是你垃圾。」
A. Acoustic String
题意
给定一 01 串,每一轮求其相邻两位的异或值得到一个长度小一的串,直到串长度为 1。求最后的结果。。
题解
考虑每一位的贡献,其被异或的次数是一个组合数。要知道这个组合数模 的结果,用 Lucas 定理即可,实现可用位运算。
B. Breaking the Code
题意
给定一字符串,一次操作可以删除第一个字符、最后一个字符、第二个字符或倒数第二个字符。给定 求最后可能得到的字典序最小的长为 的字符串。。
题解
最后答案的组成(除非是单个字符)一定是一个字符+一个子串+一个字符。第一个字符取所有最小字符中最靠前的一个,之后找所有长为 的子串中字典序最小的一个(构造 SA 并获得求 LCP 的能力),最后再找剩下部分里的最小字符。
C. Catch the Animals
题意
平面上有 个,用尽可能少的直线将这些点划分到不同的区域,构造方案。。
题解
先枚举所有点的子集,判断是否可以用一条直线划分这些点:对于两部分点,求凸包,凸包不相交即可。然后一划分方案为状态( 级别)DP。
D. Devilish Game
题意
有两个正整数 ,两人博弈,每人可以做两个操作之一:将 减去 到 中的一个正整数、或将 加上 到 中的一个正整数。求谁必胜。。
题解
- 如果当前状态在只允许加的时候是先手必败的话,那后手一定可以把减的东西加回来;先手想要能翻盘,只可能减一次就减到小质数;
- 当前状态在只允许加的时候是先手必胜的话、要么有个很近的较小的质数让先手直接赢,要么先手按照往大的质数凑的策略做(同时消掉对方减 A 的操作)。
即如果一次就能减到小质数,先手必胜;否则,结果跟只能加一样
E. Equinox
题意
给定一个 个点的无向图,给定三个不相交的、各自连通的点集。求一个最小的点集,使得四个点集并起来后连通。。
题解
有两种情况:点集 通过路径相连、点集 通过路径相连;或三个点集通过某个路径连到某中心点。求从点集出发的最短路即可。
F. Famous Smoothie
题意
排列给定的 个数,使得下面方法求出的值最大:
- 求每个前缀的 。
- 求这些 的 。 。
题解
取出一个最大的数放到前面,剩下的数按从小到大排列。
G. Great Ascent
题意
有一座山,从 高度出发(最后不一定回到起点),向上向下单位高度各需要 的时间。 个任务,每个任务是把物品从一个高度运到另一个高度,中途你可以任意改变方向、持有任意数量的物品。前 个任务必须完成。对于所有 ,求额外完成后 个任务中的前 个,最少需要走的总时间。。
题解
显然我们要走到所有任务涉及到的最高点,向上的过程中就可以完成所有向上的任务,因此只需要考虑向下的任务。
一个显然的方案是向下的任务都在向下的过程中完成,向下一直走到所有向下的任务涉及的最低点。但这不一定最优;考虑最后一段( 到 )和倒数第二段( 到 )向下的任务(如果多个任务区间重叠,那合并成一段),我既可以选择到达 后花费 继续往下走,也可以选择在上升过程中就完成最后一段任务(),花费 。
因此我们考虑到了顶点之后向下走多少;每多走没被覆盖的一格,就额外多花费 的时间;每多走被覆盖的一格,就额外少花费 的时间。
区间覆盖、查询最小前缀和。
H. Harmony of Skills
题意
给定一棵无根树,点有点权。多次询问,给定一个点,询问若以其为根,有多少对子树是同构的。。
题解
先通过换根 DP 求出所有子树的哈希。接着 DFS,每次走一条边只会改变一个子树,边搜索边维护可以求出所有点为根时的答案。
J. Jester's Scroll
题意
通信题。
给定序列 ,保证 是定值;把 中连续的相同数压缩成一个数得到 , 同理。这个序列会给到程序甲,程序甲可以传递 个 bit 给程序乙。程序乙会收到 和甲传递的 个 bit,求出一个可能的 (即只需满足 是定值、压缩后得到的序列与乙收到的相同、长度为 ;不需要是原序列。显然如果忽略计算量、乙可以不借助甲传递的信息)。。另有 且只能传输 1-bit 的子任务。
题解
考虑假如乙已经复原出 的一个前缀,现在他要决定序列的下一个元素分别是否取 中的下一个元素、还是重复当前元素。分析需要考虑的选项:
- 首先 中的下一个元素要存在;
- 其次新的元素的和要与当前元素的和相同;
- 最后,三个数全部重复的选择可以直接抛弃,只在 都被取空后再用这个选择。 简单讨论,发现每个位置至多有 种选择。约定好找到选择的方式(顺序),甲只需要找到 在每个(不是全部重复上一个数的)位置具体选了哪种,传递给乙,乙复刻甲的选择即可。
时,可能的选择只有一个,从而不需要传递信息。
K. Killer Tetris
题意
按照类似俄罗斯方块的规则,许多“倒直方图”形状的砖块从顶部给定位置依次掉落、各行填满后会被消除。模拟这个过程,输出第一个网格塞不下的时刻。。
题解
全局维护一个映射,表示原始行号和现在所处高度(因为高度可能会随着消除行而变小)。
为每一列维护一个 set 表示有方块的行号,每一行维护这一行被填入了多少方块。
下落时找到对应列的最高有方块行号、转化成高度、计算砖块掉到什么高度、在 set 里相应插入行号、在行上加方块数、消除时移除 set 内元素并更新映射
(L 和 M 是队友写的)