扫描线随感
离线扫描线
扫描线的本质:高自由度静态问题 \(\to\) 低自由度动态问题。
思考过程:
-
唯一的隐藏维度是值域,先考虑是否交换某维度和值域。新的隐藏维度作为“值域”,其他维度作为“范围”。
-
用正交范围刻画修改、查询的范围,修改、查询都形如范围的每个维度有 \(2-side\) 限制,可能还带有一个值,此时范围和值域作为“介质”。
-
决定扫描的维度,将它们差分或分治为 \(1-side\)(修改范围和查询范围在每个扫描维度上方向相反,查询范围和扫描在每个扫描维度上方向相反),此时它们各贡献 \(1\) 的自由度,各用一个指针处理,其余“范围维度”使用 DS 维护。此时“范围维度”分为“扫描维度”与“维护维度”。
-
扫描线的一个状态是“扫描维度”空间中的一个点,表示当前正维护该范围内的“维护维度”与“值域”。修改和查询都表示为“点”+“维护维度的范围”+“值”,在每个扫描维度上各自是单点或 \(1-side\) 范围。我们将状态转移至每个询问处,每次移动一个指针时处理修改,代价为仅固定该维坐标得到的修改点的数量(如二维扫描线,一行或一列的点数)。确定转移状态的路径。
-
修改贡献给查询 + 查询抓修改的贡献,通过反演平衡二者。之后用 DS 维护。
tricks
常见的维度有 时间维 / 操作维、序列维、值域维。扫时间维时常忽略扫描线。
要求修改在查询之前,可先分离修改和查询。
刻画时去重:保留当前最能造成贡献的元素(支配其他元素),视作代表元。注意去重条件可能与扫描状态有关,比如单调性。
对扫描过程可持久化即可在线查询。
半在线扫描线
DP。
基于扫描线的 DP 优化:
-
DP 的空间分为状态的若干维度和值域维,其过程是半在线扫描线:扫状态的各个维度,用之前求出的答案推出之后的答案。
-
所以 DP 优化的第一步是处理维度:先确定哪个维度作为值域(考虑是否换维),再确定扫哪个 / 哪些维度,并用 DS 维护不扫的状态维度。而第二步是确定扫描顺序(DAG 拓扑序)。之后是第三步:优化转移,此时要平衡填表和刷表(二者可以共存),这对应扫描线中的反演。
2025.10.12 & 2025.10.13
浙公网安备 33010602011771号