只会$O(mt)$
まず質問ビットの、時間がある、彼らは~~考えるのがポイントルーチンを分割する(多分私はより多くのネットワーク・フローを行う)の最大時間$ tの$を設定する~~、その後、すべての点は$のT $、でも上原に分割され側面図に待っています。
$ 70pts $を得るためにおめでとう
この思考の基礎(バオ)道路(LI)で、私たちがいる限り、すべての時間の保持がそれを指摘するように、無意味である各ポイントが$のT $ Aに分割されていることがわかったので、$ののNT $からのポイントの合計数に$ 2メートル$、$ダイクストラ$ $ O(M(T + LOGN))の複雑さとともに減少$、約$ 2 \回10 ^ 8 $に落ち、それは容易に想像233を通過していません
あなたは私をDij dijので死ぬことを選択したことを言います
書式#include <cstdioを> する#include <アルゴリズム> 書式#include <ベクトル> の#include <キュー> 使用して 名前空間はstdを、 typedefの長い 長いLL。 const int型 N = 100050 ; チャーはrB [ 1 << 21 ]、* S * T。 インラインチャー GC(){ 戻り S == T &&(T =(S = rBの)+関数fread(RB、1、1 << 21、STDIN)、S == T)EOF:* S ++ ;} インラインint型RD( ){ チャー C = GC()。 一方、(C < 48 || C> 57)C = GC()。 INT X = C&15 。 用(C = GC(); C> = 48個の && C <= 57、C = GC())x =(x << 3)+(X << 1)+(C&15 )。 リターンのx; } INT G [N]、P [N << 1 ]、Q [N << 1 ]乃至[N << 1 ]、NXT [N << 1 ]、N、M、A、B、C。 構造体ノード{ int型のP、T。 LL D; BOOL行きます。 ノード() {} P、int型の T、LL D、BOOL GO):P(P)、T(T)、D(D)、ゴー(GO){} インラインBOOLの 演算子 <(constのノード&B)のconst { 戻り D> BD ;} }; PRIORITY_QUEUEは、 <ノード> Q; ベクター < INT >ティム[N]、TMP; // のティム時間離散 ベクトル<ベクトル< INT >> ID [N]; // ノードの開始時間t Uを記録しますNO側ない ベクトル<LL> D [ 2 ] [N]; int型のmain(){ int型I、U、 ノードH; LL ANS =0x3f3f3f3f3f3f3f3f ; N = RD(); M = RD(); A = RD(); B = RD(); C = RD()。 用(i = 1 ; I <= M; ++ I){ U = RD();に[I] = RD(); P [I] = RD(); Q [I] = RD()。 NXT [I] = G [U]、G [U] = I。 } ティム[ 1 ] .push_back(0 )。 用(U = 1 ; U <= N; ++ U) のための(I = G [U]; I; I = NXT [I]){ ティム[U] .push_back(P [I])。 。一back(Q [i])と[I]乃至]ティム。 } のための(U = 1 ; U <= N; ++ U){ ソート(ティム[U] .begin()、ティム[U] .END())。 ベクター < INT > ::イテレータそれ= 一意(TIM [U] .begin()、ティム[U] .END())。 ティム[U] .erase(それは、ティム[U] .END())。 // 去重 ため(i = 0 ; iはティム<U] .size(); ++ I){ ID [U] .push_back(TMP)。 D [ 0 ] [U] .push_back(ANS); D [ 1 ] [U] .push_back(ANS)。 } } のための(U = 1 ; U <= N; ++ U) のための(I = G [U]; I; I = NXT [I]){ ID [U]は[Pの[I] = LOWER_BOUND(TIM [ U] .begin()、ティム[U] .END()、P [I]) -ティム[U] .begin()]一back(I)。 Q [I]=(。。)(開始、TIMは終了()[[I]に]、Q [i]は[I]に] TIM)LOWER_BOUND - 。ティム[する[I]])(始めます。 } Q.push(ノード(1、0、D [ 1 ] [ 1 ] [ 0 ] = 0LL、1 ))。 一方、(!{Q.empty()) H = Q.top(); Q.pop()。 もし(D [h.go] [U = HP] [HT] = HD!)続けます。 もし(HD> ANS)ブレーク。 // 剪枝 場合(U == h.d + N &&ティム[N] [HT] <ANS)ANS = h.d + ティム[N] [HT]。 もし(h.go)のための(I = HT; iが[U] .size()ティム<; ++ I)であれば(h.d + *(ティム[U] [I] -tim [U] [HT])*(TIM [U ] [I] -tim [U] [HT])+ B×(ティム[U] [I] -tim [U] [HT])+ C <D [ 0 ] [U] [i])とQ.push (ノード(U、I、D [ 0 ] [U] [I] = h.d + A *(ティム[U] [I] -tim [U] [HT])*(ティム[U] [I] -tim [U] [HT])+ B×(ティム[U] [I] -tim [U] [HT])+ C、0)); // 等待 他。 そう するために(i = 0 ; iはIDを<U] [HT] .size(); ++ I)の場合(HD <D [ 1 ] [する[ID [U] [HT] [i]は] [Q [ID [U] [HT] [I]]])Q.push(ノード([ID [U]に[HT] [I]、Q [ID [U] [HT] [I]、D [ 1 ] [する[ID [U] [HT] [I]]] [Q [ID [U] [HT] [I]]] = HD、1))。 // 坐车 } のprintf(" %のLLD " 、ANS)。 リターン 0 ; }