$Slingshot$
对于本题,我们进行分类讨论:
$ 1. $
对于这种情况,$x \to y$ 包含了 $s \to t$ ,所以此时的选择有两种:
① 先从 $s$ 走到 $x$ ,然后穿到 $y$ ,再从 $y$ 走到 $t$ 。
② 直接从 $s$ 走到 $t$ 。
然后我们 $yy$ 一下,如何用线段树维护多个 $x \to y$ 只选一个最优的 $x \to y$ 的情况。
显然,这是个线段树维护区间最小值裸题。
所以,由于我们根据 $x$ 端点排序,所以只需要将 ① 情况的路程插入线段树中的 $ y $ 节点的位置即可。
对于这种情况,路程就是
$$
ti + (s - x) + (y - t)
$$
在线段树中插入这个东东即可。
$ 2. $
对于这种情况, $ s \to t $ 包含了 $ x \to y $ 的情况,所以路程就是
$$
ti + (x - s) + (t - y)
$$
$ 3. $
对于这种情况, $ s \to t $ 包含了 $ x $ ,不包含 $ y $ ,所以路程就是
$$
ti + (s - x) + (t - y)
$$
$ 4. $
与 $ 3 $ 同理,只是包含情况反一下,也就是
$$
ti + (x - s) + (y - t)
$$
离散化一下,四种情况各建一棵线段树就完了。
$ Code: $
1 |
|
另外,关于循环的问题为什么有两种正序,两种倒序呢?
让我们再看一遍先前的例图:
前两个正序的:
后两个倒序的:
发现了吗,两者之间的奥秘。
留给读者自行证明。
从前面开始扫,由于 $ y $ 是排过序的,你插入的点就会在 $ s \to t $ 之间,否则有可能在外面,就是不优的,是错的。