(事業部の定格。2)教育Codeforcesラウンド69 E.文化コードDP(転送セグメントツリー)または最短数

トピックリンク

質問の意味: 

無駄なスペースで各外積のマトリョーシカ人形内積をそこにn個の人形の内部の空気の最大量と組み合わせて、複数(または1)人形を意味します

Q.赤ちゃんのセットがありますどのように多くの組み合わせ無駄なスペースの最小値になります(キャッチすることはできませんが明らかに他の誰かが彼女の答えは最小ではありません設定し、キャッチ)

 

ソリューション: 

セグメントツリーの最適化DP

  • 提供DP [i]の.minnのように人形i番目を表し、最も内側の人形最小限の無駄なスペースの人形すべての組み合わせ、状態が$ INJから転送されたことは明らかである>でOUTI $
  • jは、ネストされたオブジェクトを見つけることが再び簡単に彼女の内積発注の最初のセットに従い、N 
  • まず、明らかにバイナリサーチ後方DP jの人形JN最小の$ INJ>アウト$を満たすので、[i]のうち(挿入$ dpの[J]のi番目の位置で検索を指示し、最小遷移条件を満たして.minn- [i])と-in、DP [J] .num $へ
  • 便利なのアレイと多いツリー状の構造は、(チームメイトの後TQLを思い出させる!!!)マージするpush_upを最適化することができ、
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 2E5 + 10 INT [N]、NUM、ミネソタ州。
#define   っ長い長い
LL ANS; 
CONST LL MOD = 1E9 + 7 構造体ノード{LLミネソタ州、NUM;} T [N << 2 ]。

ノードマージ(ノードA、ノードB)
{ 
    場合(a.minn == b.minn)リターン(ノード){a.minn、(a.num + b.num)%のMOD}。
    もし(a.minn <b.minn)リターン(ノード){a.minn、a.num}。
    もし(a.minn> b.minn)リターン(ノード){b.minn、b.num}。
}
ボイドアップノード(int型のx、int型 V、INTの NUM、int型の L、int型の R、int型のPOS)
{ 
    場合(L == R){T [POS] =(ノード){V、NUM}。リターン;}
     int型、M =(L + R)>> 1 もし(x <= M)アップノード(X、V、NUM、L、M、POS << 1 )。
    他のアップノード(X、V、NUM、M + 1、R、POS << 1 | 1 )。
    T [POS] =マージ(T [POS << 1 ]、T [POS << 1 | 1 ])。
} 
ノードQminを(INTL、INT R、int型の L、int型の R、int型のPOS)
{ 
    場合(L <= 1 && R <= R)戻りT [POS]。
    INT、M = L + R >> 1 ;ノードANS =(ノード){ 10000000000 }。
    もし(L <= M)ANS =マージ(ANS、Qminを(L、R、L、M、POS << 1 ))。
    もし(R> M)ANS =マージ(ANS、Qminを(L、R、M + 1、R、POS << 1 | 1 ))。
    戻るANSを。
} 
構造体 NODEは{ int型 アウト[N]} S;
int型のn;
INT メイン()
{ 
    CIN >> N。
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %d個の%のD "、&​​S [I]。うち、&​​S [I] 
    ソート(S + 1、+ S 1 [](ノードA、ノードB)、+ N { 戻す <B。;}); 

    以下のためにint型 I = N; I> = 1 ; i-- 
    { 
        int型の L = 1、R = N、ANS = - 1 一方、(L <= R)
        {
            INT半ば=(L + R)>> 1 もし(S [中間]  > = sの[I] アウト)ANS =中間、R =半ば1 他の L =ミッド+ 1 ; 
        } 
        場合(ANS == - 1)アップノード(I、S [I] において11、nは、1 )。
         
        { 
            ノードU = Qminを(ANS、nは、1、nは、1 )。
            アップノード(I、u.minn - (S [i]のうち。-s [I] において)、u.num、1、nは、1)。
        } 
    } 
    COUT << T [ 1 ] .nu​​m。
    リターン 0 ; 
}
コード

 

最短数

  • ( - アウト[PK-1]で[PK​​-2])+ ... +(私たちは中に$ [PK] +(中[PK-1] -out [PK-1])+何であるかを維持したいですで【PK1]アウト[PK1])$およびアウト$を満たす最小数[PK]>で[N] $
  • 私たちも、図からできます。このパス下に維持$ラン([I] -in [I + 1]におけるI、I + 1)$ 0〜N-1の追加は、[PK]であります  
  • あります([PK-1]で - アウト[PK-1])を最適化することができる最短の追加最小一時$オブジェクトを転送することができる設定([TEMP]で、私は、一時-out [i])と$を見つけることができますちょうど式上記の1つを使い果たし
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 2E5 + 10 const  int型 MOD = 1E9 + 7 構造体ノード{ int型 アウト;} [N] S。
int型 N、ANS、DIS [N]、CNT [N]、VIS [N]、POS、ヘッド[N]、ミネソタ州= 1E9。
構造体のエッジ{ INTに、NEX、V;}エッジ[N << 1 ]。
ボイド追加(int型int型 B、INT C){エッジ[++ POS] =(エッジ){B、ヘッド[A]、C};ヘッド[A] = POS;}; 

INT メイン()
{    
    CIN>> N;
    以下のためにint型私= 1 ; iが<= N; iが++)のscanf(" %d個の%のD "、&​​S [I]。うち、&​​S [I] 
    ソート(S + 1、+ S 1 [](ノードA、ノードB)、+ N { 戻す <B。;});
    以下のためにint型 I = 0追加(I、I +; iがn <Iは、++は)1、S [I + 1 ]  -s [I] 以下のためにint型 i = 1 ; iが++; iが<= N 
    {
        INTの TEMP = - 1、L = 1、R = N。
        一方、(L <= R)
        { 
            int型ミッド= L + R >> 1 もし(S [中間]  > = S [I] アウト)TEMP =中間、R =半ば1他の L =ミッド+ 1 ; 
        } 
        場合(TEMP == - 1続けます他の(私、一時、S [TEMP]を追加 -s [i]を。アウト); 
    } 
    のmemset(DIS、0x3fをはsizeof DIS)。 
    DIS [ 0 ] = 0 ; CNT [ 0 ] = 1 ;
    以下のためにint型私= 0 ; iが<= N; iが++ 
    { 
        ためINT J =頭部[I]; J; J = エッジ[J] .nex)
        { 
            int型 V = エッジ[J] .TO。
            もし(DIS [I] +エッジ[J] .V <DIS [V])DIS [V] = DIS [I] +エッジ[J] .V、CNT [V] = CNT [i]は、
            そう であれば(DIS [I] +エッジ[J] .V == DIS [V])CNT [V] + = CNT [i]は、CNT [V]%= MOD。
        } 
    } 
    のためにint型 I = 1 iが<= N; iが++ { もし [I](S。アウト > S [N]。&& DIS [I] <ミネソタ州)ミネソタ州= DIS [I];}
     ためint型 I = 1は iが++; iがn = <; 場合。(S [i]のうち。> S [N]  && DIS [I] = =ミネソタ州)ANS =(ANS + CNT [I])%MOD。
    coutの << ANS;
    リターン0 ; 
} 
コード

 

おすすめ

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