9.22

P4149 [IOI 2011] Race

裸点分治,但有两个需要注意的地方:

  1. 重心作为全局变量时,可能被递归调用覆盖,应保存当前重心。
  2. 每次都清空值域 \([0,k]\) 内的整个数组,代价过高。应记录被修改的下标,只清空这些位置。

对于 DSU on tree 的思路,维护的信息不应随着转移而整体偏移,否则容易超时。因此,应维护从固定根到当前节点的信息。

P7670 [JOI 2018 Final] 毒蛇越狱 / Snake Escaping

\(O(3^L)\) 和 \(O(q2^L)\) 都无法通过。

由抽屉原理,字符 0、1、? 中,出现次数最少的一种至多出现

\[\left\lfloor \frac{L}{3}\right\rfloor \]

次。因此,可以根据出现次数最少的字符分类,将单次查询的复杂度降至

\[O\left(2^{L/3}\right). \]

具体而言:

  • 若 ? 最少,直接枚举所有 ? 的取值。
  • 若 0 最少,利用 0 对应的限制可以由 ? 与 1 作差得到,通过容斥计算。
  • 若 1 最少,同理,利用 ? 与 0 作差并容斥。

使用高维前缀和、后缀和(子集和、超集和)预处理,即可快速求出容斥中需要的结果。总时间复杂度为

\[O\left(L2^L+q2^{L/3}\right). \]

CF559E Gerald and Path

自然想到 DP。状态需要记录:

  • 当前枚举到的灯 \(i\);
  • 当前右端点最靠右的线段所对应的灯 \(j\);
  • 灯 \(j\) 的方向 \(k\)。

由于各条线段的右端点不一定单调,不能只记录最后一盏灯。

后面枚举到的灯 \(u\),可能照亮此前两段明亮区域之间的空隙。因此,所有 \(i<u\) 的状态都应有机会向 \(u\) 转移。

但仅允许跨越若干盏灯转移到 \(u\),仍不足以处理所有情况。例如,连续从 \(i\) 转移到 \(i+1\) 时,新增线段的右端点可能不断递减,此时只考虑 \(u\) 仍可能遗漏补齐中间空隙的贡献。

考虑将 \(u\) 与对应前缀中右端点最大的区间 \(v\) 一起计算。在上述补空隙的情形下,可以证明二者的并为

\[[L_u,R_v], \]

其中 \(L_u\) 为区间 \(u\) 的左端点,\(R_v\) 为区间 \(v\) 的右端点。

因此,同时枚举 \(u\) 和 \(v\),即可覆盖这些补齐中间空隙的情况,使转移完整。

AT_agc023_d [AGC 023 D] Go Home

考虑当前最左端和最右端的节点,位置分别为 \(x_l,x_r\)。

最后到达的节点必定是两个端点之一。如果先向人数较少的一端行驶,必定会在途中转向,因此最后到达的一定是两端中人数较少的一端。

从一个端点走到另一个端点的过程中,所有剩余乘客都会下车,耗时为

\[x_r-x_l. \]

因此,对于人数较少的一端,让另一端的到达时间尽可能早,对自己也是最优的。于是,两端的最优选择一致,可以将两端人数合并,并放到人数较多的一端。

每次合并时,将总耗时增加

\[x_r-x_l, \]

然后递归处理剩余节点。

posted @ 2026-09-23 23:40  stilldust  阅读(4)  评论(0)    收藏  举报