#587ラウンドCodeforces(本部3)F - のWi-Fi DP最短

質問の意味:

与えられたnはその後、kの左右のkにロードされたルータがネットワーク上にインストールしてインストールすることができる場合、私はいくつかの部屋を費やしたとして、ネットワークに接続されたネットワーク、i番目の部屋に接続された各部屋を与える余地はルータにインストールすることができます。ルータiに対するコスト

すべての客室には、ネットワークを装着したように、Qは、最小値をとります

 

DP単調スタック:

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#define担当者(I、B)(I =(A)がINT;方には<=(B); iが++)
 の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I)
 の#defineは長い長いっ
 の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照
 の#define INF 0x3f3f3f3f
 の#define CLR( 、V)のmemset(A、V、はsizeof A)
 ///////////////////////////////// / 
CONST  INT N = 2E6 + 10 INTのN、M、L、R、ST [N]、K。
チャーS [N]。
LL DP [N]。

INT メイン()   
{            
    scanf関数(" %D%dの"、&​​N&K)。
    scanf関数(" %sの"、S + 1 )。
    L = R = 1 ; STは、[ 1 ] = 0 
    担当者(I、1、N + K)
    {        
        DP [I] = DP [I- 1 ] + I。
        もし(I> K && S [IK] == ' 1 ' 
        {    
            DP [I] =分(DP [I]、DP [ST [L] + IK )。
        }    
        であれば(ST [L] <I- 2 * K)L ++ 一方(L <= R && DP [ST [R]]> = DP [I])r--の; 
        ST [ ++ R] = I。
    }        
    LL ANS = 1E18。
    担当者(I、N、N + K)ANS = 分(ANS、DP [I])。
    coutの << ANS;
    リターン 0 ; 
}
コードの表示

 

ゲームは最短の練習のとき

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
// BXDによる入力
の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT)
 の#defineためreppを(I、B)(I =(A int型); I> =(B); - I)
 の#define RI(N)のscanf( "%d個"、&(N))
 の#define RII(N、M)のscanf( "%D%dの"、およびN、 &M)
 の#define RIII(N、M、K)のscanf( "%D%D%D"、&N、&M&K)
 の#define RS(S)のscanf( "%sの"、S);
#defineは長い長いっ
 の#define INF 0x3f3f3f3f
 の#define REP(I、N)のための(; iが(N)<I ++は、I = 0をINT)
 の#define CLR(A、V)のmemset(A、V、

 N = 1E6。
const  int型 M = 1E6;
int型のヘッド[M];
int型のPOS。
構造体のエッジ
{ 
    LLのV。int型、NEXに。
}エッジ[M]。
ボイド(ADD INTint型B、LLのC)
{ 
    エッジ[ ++ POS] = エッジ{C、B、ヘッド[A]}。
    ヘッド[A] = POS。
} 
構造体ノード
{ 
    LL dを、int型のID。
    ブール 演算子 <(constのノード&B)のconst 
    { 
        戻り D>BD; 
    } 
}。
LL DIS [N]。
int型VIS [N];
INTのN、M、K、A、B、C、T。
チャーS [N]。
ボイドダイクストラ(int型の)
{ 
    担当者(I、0、N + 1)DIS [I] = 1E18。
    DIS [S] = 0 ; 
    PRIORITY_QUEUE <ノード> Q; 
    q.push(ノード{ 0 、S})。
    一方、(!q.empty())
    { 
        ノードU = q.top(); q.pop()。
        もし(VIS [u.id])続けます
        VIS [u.id]= 1 ;
        以下のためにint型 ; I I = I =ヘッド[u.id】エッジ[I] .nex)
        { 
            int型 V = エッジ[I] .TO。
            もし(u.d +エッジ[I] .V < DIS [V])
            { 
                DIS [V] = u.d + エッジ[I] .V。
                q.push(ノード{DIS [V]、V})。
            } 
        } 
    } 
} 
int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N&K)。
    scanf関数(" %sの"、S + 1 )。
    担当者(I、1、N)
    { 
        追加(I、I + 1、1LLの*のI)。
        追加(I、I - 1、1LL * 0 );
        もし(S [I] == ' 1 ' 
        を追加(MAX(1、IK)、分(N + 1、I + K + 1)、1LL * I)。
    } 
    (N追加 + 1 * 1LL、N、0 ); 
    ダイクストラ(1 )。
    COUT << DIS [N + 1 ]。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11566746.html