考前思维小练
\(\text{考前思维小练}\)
\(\text{zph}\)
\(\text{2025.7.9 绍兴}\)
小题六道,供大家考前活跃思维 ~
A
https://acm.hdu.edu.cn/showproblem.php?pid=7393
解法
- 把所有人平均分成 \(m\) 组,保证一组人正确即可。
- 第 \(i\) 组假设所有的数之和 \(\bmod m\) 为 \(i\)。
B
解法
- 只需要考虑 \(O(n)\) 个形成等差数列的矩形。
- 考虑笛卡尔树。
- 可以选择用一条从某个点到某个叶子的路径,换取若干的代价。
- 简单的对所有子树 dp 就行,可以用树链剖分之类的维护。
C
https://yundouxueyuan.com/p/YDSP2023D1BonusB?tid=6524d8a87f2ff06296bb2f3b
请考虑如下加强版(为了避免剧透,这里的 log 可以是任何东西的 log):
- 1log 时间的 \(LIM=2\)
- 2log 时间的 \(LIM=3\)
解法
- XOR Hashing
- 直接查看两个集合的 XOR Hashing 的差值,看它是不是一个数的哈希值,可以解决 \(LIM=1\)
- 随机分组/二进制分组即可,甚至可以解决 \(LIM=3\)(一定有一份只有一个数,找出之后 Reduce to \(LIM=2\))。
- 别解:同时维护 SUM Hashing 和 XOR Hashing,利用等式 \(a+b=a \ \text{xor} \ b + 2(a\ \text{and} \ b)\),可以计算出集合中差的两个数的 AND,然后根据“两数 XOR 的某一位为 \(1\),则 AND 的这一位必须是 \(0\)” 这一基本事实判准即可。
- 感性理解正确性:令哈希值位长为 \(64\),因为 SUM 和 XOR 均可大致看作随机数,故在 NO 的情况下 AND 有期望 \(32\) 个 \(1\),而每一个 \(1\) 都大致有 \(1/2\) 的概率识别出 NO,故错误率大致为 \(2^{-32}\)。
D
解法
- 将最左边的
X和最右边的Z拿出来,只有中间那一段有用。对于一个同字符的极长连续段,其中也只有一个有用。也就是说字符串一定可以被转化成XY?Y?Y?...?YZ的形式。观察到其中一定存在子串XYZ,将这个Y删去,然后删去两边之一(注意不要把头尾删去),就能得到一个子问题。 - 一个特别简洁的方法是,取最左边的
Z,然后从这个Z前面的位置不断往前删,直到前面只剩下一个开头X(注意这个X不要删掉),然后删去这个Z,取下一个Z进行相同的步骤。这个做法只需要知道所有Z的位置。进一步观察,发现只需要知道每一个Z的连续段的最后一个位置就行。 - 也就是说,我们发送的长度为 \(N\) 的 \(01\) 串不存在相邻的 \(1\),考虑计算一共有多少长度为 \(N\) 的串,写出 dp 式子发现就是斐波那契数列的第 \(N\) 项,小于 \(2^{70000}\),理论可行,但是数字太大了,算起来很慢,退而求其次,考虑分块,枚举一些块长,发现:
- 将串每 \(63\) 个分一块,用 \(44\) bits 传递就行。
- 至于如何实现?我们可以计算出一个串是字典序第 \(rank\) 小的串,传递 \(rank\),解密的时候,类似线段树二分,可以根据 \(rank\) 是否小于等于填 \(0\) 后的方案数,确定每一位是 \(0\) 还是 \(1\)。
E
https://codeforces.com/gym/105666/problem/D
解法
- 观察到如果确定了所有
LR类点的方向,每个UD类点都是独立的,把它们的方案数乘起来就行。 - 更进一步的,如果有两个
LR类点 \((x_u,y_u),(x_v,y_v)\),且有 \(x_u \lt x_v\),\(u\) 往右边画,\(v\) 往左边画,那么这两条线就能覆盖整个 \(x\) 轴,每个UD类点能唯一确定方向,确定所有UD类点后,按照前文的观察,另外的LR类点也都是独立的了。 - 假设我们有 \(m\) 个
LR类点,用一个包含L和R的长度为 \(m\) 的字符串来表示这些点的方向,具体的,第 \(i\) 个字符表示 \(x\) 坐标第 \(i\) 小的点的方向。如果字符串中没有RL出现,这个字符串一定形如LL...LL RR...RR,只有 \(O(n)\) 种,枚举一下就行。 - 如果有
RL出现,不妨枚举第一个RL出现的位置,一共 \(O(n)\) 种,此时字符串形如LL...LL RR...RR RL ??...??,确定第一个RL的位置后,所有UD类点的方向确定了,此时字符串的每个位置能填哪些字符也确定了,即,我们能确定左边的“分界点”的数量,和右边每个?的选择的数量,总方案数就能算了。 - 精细实现能做到 \(O(n^2)\)。
F
解法
解法:
-
令 \(N,L\) 同阶。
对于道路 \(i\),考察这条道路上所有人的决策,令
<表示往左走,>表示往右走,x表示离开,则决策一定形如:<<...<< >>...>> xx...xx或者>>...>> <<...<< xx...xx。x是一段后缀很好理解,不然会有一个x的时刻,左右至少有一个没满员,与题意矛盾。<<...<< >>...>>这种结构也很好理解,考虑 exchange arguments:如果有决策形如<<><>,则交换第二个和第三个,变成<<<>>,交换后你会发现左右两边被塞满的时刻不会变晚。 -
有了这个性质后,我们就可以 dp 了,令 \(dp(i,<,>,\text{x},0/1)\) 表示,考虑了前 \(i\) 条道路,第 \(i\) 条道路上
< > x分别有对应的个数,< >哪个在前面,且从前 \(i-1\) 条道路上飞走时左右两边均已塞满,从第 \(i\) 条道路上飞走时左边已塞满。你可以理解为,在决策第 \(i\) 条道路时,需要满足第 \(i-1\) 条道路对右边的要求,和第 \(i\) 条道路对左边的要求。
进一步的,\(<,>,\text{x}\) 只需要记录其中之二,因为另一个能通过总数唯一确定。故状态数降到了 \(O(N^2)\)。
-
考虑转移,转移需要保证第 \(i-1\) 条道路的人飞走之前,右边会被塞满,所以新的 \(<\) 就被确定了,故只需要枚举一维即可转移(注意特判 \(\text{x}=0\) 的情况)。
这样就得到了时间复杂度 \(O(N^3)\) 的做法。
-
把这个做法实现出来,你会惊奇的发现转移是对一个二维数组的一条斜线取 max(如果选了 \(<,>,\text{x}\) 中不同的东西保留,这里可能会是横线或者竖线),仔细分析你写的每一句话,你还会发现左右端点都递增,可以单调队列维护。
复杂度 \(O(N^2)\)。

浙公网安备 33010602011771号