羅区P5468 / LOJ3156 [NOI2019]ルートホーム

只会$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、11 << 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(ノード(10、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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/sunshine-chen/p/11258763.html