9.22
P4149 [IOI 2011] Race
裸点分治,但有两个需要注意的地方:
- 重心作为全局变量时,可能被递归调用覆盖,应保存当前重心。
- 每次都清空值域 \([0,k]\) 内的整个数组,代价过高。应记录被修改的下标,只清空这些位置。
对于 DSU on tree 的思路,维护的信息不应随着转移而整体偏移,否则容易超时。因此,应维护从固定根到当前节点的信息。
P7670 [JOI 2018 Final] 毒蛇越狱 / Snake Escaping
\(O(3^L)\) 和 \(O(q2^L)\) 都无法通过。
由抽屉原理,字符 0、1、? 中,出现次数最少的一种至多出现
次。因此,可以根据出现次数最少的字符分类,将单次查询的复杂度降至
具体而言:
- 若
?最少,直接枚举所有?的取值。 - 若
0最少,利用0对应的限制可以由?与1作差得到,通过容斥计算。 - 若
1最少,同理,利用?与0作差并容斥。
使用高维前缀和、后缀和(子集和、超集和)预处理,即可快速求出容斥中需要的结果。总时间复杂度为
CF559E Gerald and Path
自然想到 DP。状态需要记录:
- 当前枚举到的灯 \(i\);
- 当前右端点最靠右的线段所对应的灯 \(j\);
- 灯 \(j\) 的方向 \(k\)。
由于各条线段的右端点不一定单调,不能只记录最后一盏灯。
后面枚举到的灯 \(u\),可能照亮此前两段明亮区域之间的空隙。因此,所有 \(i<u\) 的状态都应有机会向 \(u\) 转移。
但仅允许跨越若干盏灯转移到 \(u\),仍不足以处理所有情况。例如,连续从 \(i\) 转移到 \(i+1\) 时,新增线段的右端点可能不断递减,此时只考虑 \(u\) 仍可能遗漏补齐中间空隙的贡献。
考虑将 \(u\) 与对应前缀中右端点最大的区间 \(v\) 一起计算。在上述补空隙的情形下,可以证明二者的并为
其中 \(L_u\) 为区间 \(u\) 的左端点,\(R_v\) 为区间 \(v\) 的右端点。
因此,同时枚举 \(u\) 和 \(v\),即可覆盖这些补齐中间空隙的情况,使转移完整。
AT_agc023_d [AGC 023 D] Go Home
考虑当前最左端和最右端的节点,位置分别为 \(x_l,x_r\)。
最后到达的节点必定是两个端点之一。如果先向人数较少的一端行驶,必定会在途中转向,因此最后到达的一定是两端中人数较少的一端。
从一个端点走到另一个端点的过程中,所有剩余乘客都会下车,耗时为
因此,对于人数较少的一端,让另一端的到达时间尽可能早,对自己也是最优的。于是,两端的最优选择一致,可以将两端人数合并,并放到人数较多的一端。
每次合并时,将总耗时增加
然后递归处理剩余节点。

浙公网安备 33010602011771号