先把 \((u,v,l,r)\) 变成 \((u,v,l,r-1)\)。
不能停留,所以每个时刻有两种选择
-
在某一条边上用 2 个时刻走一个来回浪费时间等某一条需要的边开启。
-
走到下一个点。
第 1 种选择启发若时刻 \(t\) 能到 \(u\),那么若存在边 \((u,v,l,r)\),那么所有时刻 \(T\in[l,r],T\equiv t\pmod 2\) 都能到达 \(u\),设计状态 \(f_{u,l,r}\) 表示点 \(u\) 在时刻 \([l,r]\) 内所有与 \(l\) 奇偶性相同的时刻都能到达。
初始时只有合法状态 \(f_{1,0,0}\)。
对于一条边 \((u,v,L,R)\) 和状态 \(f_{u,l,r},T=\{t|t\equiv l\pmod 2\}\)。若 \(\exists x\in T,x\in[L,R]\),则可以用 \(f_{u,l,r}\) 拓展出 \(f_{v}\) 的状态(即存在时刻可达 \(u\) 且这条边开启)。
然后若 \(L\) 与 \(l\) 奇偶性相同 \(L\to L+1\),否则 \(L\to L+2\),用来表示从 \(u\) 这个点经过这条边最早在 \(L\) 时刻到达 \(v\)。
更新的话就是 \(f_{u,l,r}\to f_{v,\max(l+1,L),R}\)。
\(l+1,L\) 是分别满足能到达 \(u\),和边开启条件时最早能到达 \(v\) 的时刻,这样只有在较大的时刻才能同时满足这两个条件,而最晚时刻取 \(R\) 表示到达 \(v\) 后可以在这条边上进行选择 1 一直到这条边关闭。
但是这样的话复杂度爆炸。
因为边 \((u,v,L,R)\) 与 \(f_{u,l,r}\) 后拓展出 \(f_{v}\) 的可达时刻区间为 \([\max(l+1,L),R]\) 显然取满足拓展条件 \(f_u\) 中 \(l\) 尽量小的时最优的。于是每条边实际上只用考虑一个状态的更新即可。
考虑以状态的 \(l\) 作比较做类似 DIJ 过程拓展。
每次取出一个状态 \(f_{u,l,r}\) 必定是此时 \(l\) 最小的。且由上文可得,若某条 \(u\) 边若已经被用来拓展过的话这条边就不用考虑了。
将每个点连出去的边按拓展条件的严格程度排序,这样每次已经被用来拓展的边就是一个前缀,考虑做个类似当前弧优化的东东,这样每条边就只会被用来更新 2 次,第一次取出的状态 \(f_{n,l,r}\) 的 \(l\) 就是答案。
时间复杂度 \(O(m\log m)\)。