質問の意味:
無駄なスペースで各外積のマトリョーシカ人形内積をそこに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 =(ノード){ 1000000000、0 }。 もし(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] において、1、1、nは、1 )。 他 { ノードU = Qminを(ANS、nは、1、nは、1 )。 アップノード(I、u.minn - (S [i]のうち。-s [I] において)、u.num、1、nは、1)。 } } COUT << T [ 1 ] .num。 リターン 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 ; }