小trick
基本算法
求无序数组(不可排序)的前驱和后继(比当前值小)
Sol1
考虑离线使用 stack 来进行维护。
顺序遍历的时候,求的是 \(i\) 之前能否到达 \(i\),不能就标记数组 right[sta.top()] = i,容易证明只是所能到达的最远。
倒序遍历同理。
时间复杂度 \(\mathcal{O}(n)\),是一个离线算法(预处理)。
Sol2
用并查集。
首先找到最大值,然后找到次小值,然后看这个值跟旁边的关系,考虑是否跟他旁边的进行并查集合并,这里也是用到了跟单调栈可以延伸的性质(可以传递)。
图论重构图
Sol1
可以通过分层图设 dp 状态(适用于无向或者有向图,但后者可以缩点之后变成 DAG,性质显然更多),跑 Dij 得到最优解。
Sol2
通过题目的一些性质,进行拆点,并把边看成点相连,跑 Dij 得到最优解。

浙公网安备 33010602011771号