考前思维小练

\(\text{考前思维小练}\)

\(\text{zph}\)

\(\text{2025.7.9 绍兴}\)

小题六道,供大家考前活跃思维 ~

A

https://acm.hdu.edu.cn/showproblem.php?pid=7393

解法
  • 把所有人平均分成 \(m\) 组,保证一组人正确即可。
  • \(i\) 组假设所有的数之和 \(\bmod m\)\(i\)

B

https://loj.ac/p/3277

解法
  • 只需要考虑 \(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

https://qoj.ac/problem/3098

解法
  • 将最左边的 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 类点,用一个包含 LR 的长度为 \(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

https://qoj.ac/problem/8811

解法

解法:

  • \(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)\)

posted @ 2025-07-09 03:31  znstz  阅读(548)  评论(2)    收藏  举报