传送门
来一发大常数做法(然而网络赛的时候凸包插点的方向写反了。。。 40 p t s 40pts 40pts滚了什么我居然还有40)
对于一条边 ( u , v , p , q ) (u,v,p,q) (u,v,p,q),我们把二元组 ( v , q ) (v,q) (v,q)看成一个点。
这样下来一共有 m m m个点。
假设每个点对应有 l e n 1 i len1_i len1i个二元组 ( i , v a l 1 i , j ) (i,val1_{i,j}) (i,val1i,j),每个时间点对应有 l e n 2 i len2_i len2i个二元组 ( v a l 2 i , j , i ) (val2_{i,j},i) (val2i,j,i)
然后重新处理每条边。
对于边 ( u , v , p , q ) (u,v,p,q) (u,v,p,q),我们在 u u u对应的时间点中二分出离 q q q最近的 v a l 1 u , t val1_{u,t} val1u,t,建边 ( u , v a l 1 u , t ) → ( v , q ) (u,val1_{u,t})\rightarrow(v,q) (u,val1u,t)→(v,q),如果所有的时间点都比 q q q大就不用建了。
然后我们就建出来了一个 D A G DAG DAG,且如果我们按照时间点为关键字来 f o r for for循环更新最短路的话好像就完了???
恭喜你有 40 p t s 40pts 40pts 因为有40 p t s pts pts的点是不需要建凸包转移其它边的
那么其它边指的是什么边呢?
考虑到我们之间的建图有个 b u g bug bug,那就是 ( u , v a l 1 u , i ≤ t ) (u,val1_{u,i\le t}) (u,val1u,i≤t)全部都可以转移给 ( v , q ) (v,q) (v,q),但是我们只转移了 ( u , v a l 1 u , v a l u , t ) (u,val1_{u,val_{u,t}}) (u,val1u,valu,t)于是凉凉。
直接暴力建边好像复杂度 O ( m 2 ) O(m^2) O(m2)了啊。。。
于是考虑连边 ( u , v a l 1 u , i ) → ( u , v a l 1 u , i + 1 ) (u,val1_{u,i})\rightarrow(u,val1_{u,i+1}) (u,val1u,i)→(u,val1