跳至主要內容

Tsinghua Bootcamp 2025 预选赛部分题解

Wallbreaker5th大约 7 分钟OI×ICPCOI×ICPCOI×ICPC - 题解OI×ICPC - Lucas 定理OI×ICPC - 字典序OI×ICPC - 贪心OI×ICPC - 后缀数组OI×ICPC - 计算几何OI×ICPC - 计算几何 - 凸包OI×ICPC - BFSOI×ICPC - 构造OI×ICPC - 线段树OI×ICPC - 换根DPOI×ICPC - 树哈希OI×ICPC - DFSOI×ICPC - 通信题OI×ICPC - 模拟

注意

题解写得可能非常抽象。

「如果一个题解你看不懂,那是题解垃圾而不是你垃圾。」

A. Acoustic String

题意

给定一 01 串,每一轮求其相邻两位的异或值得到一个长度小一的串,直到串长度为 1。求最后的结果。n106n\leq 10^6

题解

考虑每一位的贡献,其被异或的次数是一个组合数。要知道这个组合数模 22 的结果,用 Lucas 定理即可,实现可用位运算。

B. Breaking the Code

题意

给定一字符串,一次操作可以删除第一个字符、最后一个字符、第二个字符或倒数第二个字符。给定 kk 求最后可能得到的字典序最小的长为 kk 的字符串。n5×105n\leq 5 \times 10^5

题解

最后答案的组成(除非是单个字符)一定是一个字符+一个子串+一个字符。第一个字符取所有最小字符中最靠前的一个,之后找所有长为 k2k-2 的子串中字典序最小的一个(构造 SA 并获得求 LCP 的能力),最后再找剩下部分里的最小字符。

C. Catch the Animals

题意

平面上有 nn 个,用尽可能少的直线将这些点划分到不同的区域,构造方案。n12n\leq 12

题解

先枚举所有点的子集,判断是否可以用一条直线划分这些点:对于两部分点,求凸包,凸包不相交即可。然后一划分方案为状态(1.4×1051.4 \times 10^5 级别)DP。

D. Devilish Game

题意

有两个正整数 A,BA,B,两人博弈,每人可以做两个操作之一:将 AA 减去 11kk 中的一个正整数、或将 BB 加上 11kk 中的一个正整数。求谁必胜。A,B,k109A,B,k\leq 10^9

题解

  • 如果当前状态在只允许加的时候是先手必败的话,那后手一定可以把减的东西加回来;先手想要能翻盘,只可能减一次就减到小质数;
  • 当前状态在只允许加的时候是先手必胜的话、要么有个很近的较小的质数让先手直接赢,要么先手按照往大的质数凑的策略做(同时消掉对方减 A 的操作)。

即如果一次就能减到小质数,先手必胜;否则,结果跟只能加一样

E. Equinox

题意

给定一个 nn 个点的无向图,给定三个不相交的、各自连通的点集。求一个最小的点集,使得四个点集并起来后连通。n,m2×105n,m\leq 2\times 10^5

题解

有两种情况:点集 A,BA,B 通过路径相连、点集 A,CA,C 通过路径相连;或三个点集通过某个路径连到某中心点。求从点集出发的最短路即可。

F. Famous Smoothie

题意

排列给定的 nn 个数,使得下面方法求出的值最大:

  • 求每个前缀的 mex\operatorname{mex}
  • 求这些 mex\operatorname{mex}mex\operatorname{mex}n2×105n\leq 2 \times 10^5

题解

取出一个最大的数放到前面,剩下的数按从小到大排列。

G. Great Ascent

题意

有一座山,从 00 高度出发(最后不一定回到起点),向上向下单位高度各需要 tu,tdt_u,t_d 的时间。m+qm+q 个任务,每个任务是把物品从一个高度运到另一个高度,中途你可以任意改变方向、持有任意数量的物品。前 mm 个任务必须完成。对于所有 ii,求额外完成后 qq 个任务中的前 ii 个,最少需要走的总时间。m,q2×105m,q\leq 2\times 10^5

题解

显然我们要走到所有任务涉及到的最高点,向上的过程中就可以完成所有向上的任务,因此只需要考虑向下的任务。

一个显然的方案是向下的任务都在向下的过程中完成,向下一直走到所有向下的任务涉及的最低点。但这不一定最优;考虑最后一段(u1u_{-1}d1d_{-1})和倒数第二段(u2u_{-2}d2d_{-2})向下的任务(如果多个任务区间重叠,那合并成一段),我既可以选择到达 d2d_{-2} 后花费 (d2d1)td(d_{-2}-d_{-1}) t_d 继续往下走,也可以选择在上升过程中就完成最后一段任务(0u1d1u1继续向上0 \to u_{-1} \to d_{-1} \to u_{-1} \to \text{继续向上}),花费 (u1d1)(tu+td)(u_{-1}-d_{-1}) (t_u+t_d)

因此我们考虑到了顶点之后向下走多少;每多走没被覆盖的一格,就额外多花费 tdt_d 的时间;每多走被覆盖的一格,就额外少花费 tut_u 的时间。

区间覆盖、查询最小前缀和。

H. Harmony of Skills

题意

给定一棵无根树,点有点权。多次询问,给定一个点,询问若以其为根,有多少对子树是同构的。n2×105n\leq 2\times 10^5

题解

先通过换根 DP 求出所有子树的哈希。接着 DFS,每次走一条边只会改变一个子树,边搜索边维护可以求出所有点为根时的答案。

J. Jester's Scroll

题意

通信题。

给定序列 a,b,ca,b,c,保证 ai+bi+cia_i+b_i+c_i 是定值;把 aa 中连续的相同数压缩成一个数得到 aa'b,cb,c 同理。这个序列会给到程序甲,程序甲可以传递 nn 个 bit 给程序乙。程序乙会收到 a,b,ca',b',c' 和甲传递的 nn 个 bit,求出一个可能的 a,b,ca,b,c(即只需满足 ai+bi+cia_i+b_i+c_i 是定值、压缩后得到的序列与乙收到的相同、长度为 nn;不需要是原序列。显然如果忽略计算量、乙可以不借助甲传递的信息)。n30000n\leq 30000。另有 ai=0a_i=0 且只能传输 1-bit 的子任务。

题解

考虑假如乙已经复原出 a,b,ca,b,c 的一个前缀,现在他要决定序列的下一个元素分别是否取 a,b,ca',b',c' 中的下一个元素、还是重复当前元素。分析需要考虑的选项:

  • 首先 a,b,ca',b',c' 中的下一个元素要存在;
  • 其次新的元素的和要与当前元素的和相同;
  • 最后,三个数全部重复的选择可以直接抛弃,只在 a,b,ca',b',c' 都被取空后再用这个选择。 简单讨论,发现每个位置至多有 22 种选择。约定好找到选择的方式(顺序),甲只需要找到 a,b,ca,b,c 在每个(不是全部重复上一个数的)位置具体选了哪种,传递给乙,乙复刻甲的选择即可。

ai=0a_i=0 时,可能的选择只有一个,从而不需要传递信息。

K. Killer Tetris

题意

按照类似俄罗斯方块的规则,许多“倒直方图”形状的砖块从顶部给定位置依次掉落、各行填满后会被消除。模拟这个过程,输出第一个网格塞不下的时刻。n,m,q2×105n,m,q\leq 2\times 10^5

题解

全局维护一个映射,表示原始行号和现在所处高度(因为高度可能会随着消除行而变小)。

为每一列维护一个 set 表示有方块的行号,每一行维护这一行被填入了多少方块。

下落时找到对应列的最高有方块行号、转化成高度、计算砖块掉到什么高度、在 set 里相应插入行号、在行上加方块数、消除时移除 set 内元素并更新映射


(L 和 M 是队友写的)