20190821試験。

予測:100 + 30 +(10/20)= 140/150実績:10 + 30 + 30 = 70。

T1:夏休み、私たちは0,1,2を使用し、小さなPは彼の休暇は、ジムに行くには少しPの準備ができて残して計画しているが、ジムや映画や映画館を見ては、状態4に毎日そうそこにその日開いていない可能性があります...図3は、0.0を示し:スタジアム、映画館は閉鎖された; 1:スタジアムは閉じ、開いている映画館; 2:オープンのジム、映画館が閉じ; 3:スタジアム、映画館は、小さなPに開かれている連続したくないために何もせずに当日たくありませんでした同じことを行うために二日、今は小さなPのための休暇の計画を手配し、実行する小さなPの何を最小限に抑えていないながら、同じことをやって二日間の日数を満たしていませんでした。

S1:見て、2-土すぐDPを考えないで、fと[I] [1/2]、私はその日の状態を再生することができます前に、私は、最大日数た初日の様子を表しています..? G [i]の点のG [I] = 0/1/2/3.①g別々に議論される[I] =時間1、F [i]を[1] =最大{F [I-1] [2] +1} 、[I] [2] = F [I-1] [2].②g[I] = 2、F [i]は[2] =最大{F [I-1] [1] +1}、F F [I] [1] = F [I-1] [1].③g[i]は= 3、[I] [1] = F F、[I] = 4.④g①②組み合わされる[I - 1] [ 1] [2]サンプル後の完全なテストサンプルはWA多くの研究の最終的なサウンド、日の自身の数手で遊んで終了 - 1]、[i]はfをすると、[2] fは[I =。 Fを選択し、[I] [0]の状態は、単にこれは結果の慎重な思考ではありません!デザインしませんでした、90点を失った!SYの首長との最後の交換後、そのF [i]が[0/1/2]表現を発見していません私はその日の破断前に、DP方程式は明らかです。

#include <iostreamの> 
する#include <CStringの> 
する#include <cstdioを> 
する#include <cmath>
 使用して 名前空間STD。
#define E出口(0)
 の#define再登録
 の#define INF 19260817
 INTの ANS、[F、nは1000010 ] [ 3 ]、G [ 1000010 ]。
INT メイン()
{ 
    freopenは(" vocation.in "" R " 、STDIN)。
    freopenは(" vocation.out "" W " 
    scanf関数(" %のD "、&N)
    (RE INT i = 1 ; iが<= N; ++ I){ 
        scanf関数(" %のD "、&G [I])。
        F [i]を[ 1 ] F [I] [= 2 ] = INFと、
    } 
    ため(再int型 i = 1 ; iは= N <; ++ I){ 
        F [i]が[ 0 ] =分(F [I- 1 ] [ 0 ]、分(F [I- 1 ] [ 1 ] 、F [I- 1 ] [ 2 ]))+ 1 もし(G [I] == 1 || G [I] == 3 
            F [i]を[ 1 ] =分(F [I- 1 ] [ 0 ]、F [I- 1 ] [ 2 ])。
        もし(G [I] == 2 || G [I] == 3 
            F [i]は[ 2 ] =分(F [I- 1 ] [ 0 ]、F [I- 1 ] [ 1 ])。
    } 
    のprintf(" %dの"、分(F [N] [ 0 ]、分(F [N] [ 1 ]、F [N] [ 2 ])))。
    リターン 0  ;
}

T2:小Pツリー構造を完了した後、ツリーの重心がツリーの関心であることが知られており、ノードがツリーの重心であり、ユニコム後に形成されたすべてのブロックのサイズを満たすためには、このノードを削除しないであろう。ツリー全体の半分以上の大きさ。ある特定の木の重心の存在を証明し、2つの焦点の最大値は今、小さなPが与えられた木で、知りたいそれらのそれぞれが焦点ですサブツリーを聞いて、ルートが存在しています。

S2:ツリー裸タイトルの重心は、[X](xはルートにある我々第1の乗算器のアレイツリー、サイズのツリートラバーサルプロセスDFS [x]は、MAXXプロセスの2つだけの特別な場合を果たしました。サブツリー最大サイズ)。各点について、我々はFAを見つけるため=サイズ[FA] / 2 [X] <[X] = FAのサイズ制限[FA] / 2、次いでサイズ> MAXX見つける倍加FAと一致する、この範囲の上限は、[FA] = xとANS。

詳細:①if(順位= X!) POS = FA [POS]は、 実際には、あなたが参照できるLCA乗算最後のステップ父のを取るために問題。

    [X] * 2> =サイズ[FA]②size。実際には、リンクのブロックサイズのサイズよりも小さい[FA] / 2の反対側を制限することです。

    そのサブツリー最大ブロックのユニコムのサイズをxは後③maxxアレイ動作が実際に切断されます。

 

書式#include <iostreamの> 
の#include <cstdioを>
 使用して 名前空間はstdを、
#define再登録
 CONST  INT MAXN = 1E6 + 10 int型 N、ID、CNT、FA [MAXN]、サイズ[MAXN]、MAXX [MAXN]、ヘッド[MAXN]、ANS [MAXN]、BZ [MAXN] [ 24 ]。
構造体扁{
     int型次へ。
} LEN [MAXN << 1 ]。
ボイド追加(INT  からINT に)
{ 
    LEN [ ++ CNT] .TO = であり; 
    LEN [CNT] .next [=先頭から]。
    ヘッド[ から] = CNT。
} 
ボイド DFS(INT X)
{ 
    サイズ[X] = 1 (RE INT K =頭部[X]; kは、K = LEN [K] .next){
         int型 =にLEN [K] .TO。
        DFS(へ)。
        サイズ[X] + = サイズ[します]。
        MAXX [X] = MAX(MAXX [X]、サイズ[します])。
    } 
} 
ボイドワーク(INT X)
{ 
    int型の POS = X。
    以下のために(再int型私は= 20 ; I> = 0 ; -I)
         であれば(BZ [POS] [I] && MAXX [X] * 2 -size [BZ [POS] [I]]> 0 
            POS = BZ [POS] [I]。
    もし(!POS = x)のPOS = FA [POS]。
    一方(POS &&サイズ[X] * 2 -size [POS]> = 0 ){
         場合(MAXX [X] * 2 -size [POS] <= 0)ANS [POS] =のX。
        POS = FA [POS]。
    } 
    ため(再INT K =頭部[X]; kは、K = LEN [K] .next){
         int型 =にLEN [K] .TO。
        働く); 
    } 
}
INT メイン()
{ 
    freopenは(" tree.in "" R " 、STDIN)。
    freopenは(" tree.out "" W " 、STDOUT)。
    scanf関数(" %d個の%のD "、&​​N、&ID)。
    (RE INT I = 2 ; iが<= N; ++ I){ 
        scanf関数(" %のD "、&FA [I])。
        BZ [I] [ 0 ] = FA [i]は、
        追加(FA [i]は、I)。);
    (RE INT J = 1 ; J <= 20 ; ++ j)の
         ための(再INT i = 1 ; iが<= N; ++ I)
            BZ [I] [J] = BZ [BZ [I] [J - 1 ] [J- 1 ]。
    作業(1 )。
    (RE INT I = 1 ++; iが<= N I)
        のprintf(" %d個の\ n " 、ANS [I])。
}

 

T3:魔法のP好きな小さな配列ので、彼は理由は簡単なような小さなUS-Pの長さnの3つの配列、A、B、Cを得たので、彼は各アレイのプレフィックスのみを維持することを決定。 。三つの小さなアレイプリフィックス長Pを仮定Uに保持され、V、アレイの完全性を確保するために、小さなPプレフィックスを確保する必要がある元の配列の3つ全てを含む(0 U≤、V、N≤w)はwの要素、およびU + V +最小ワット今は小さなPのU + V + Wの最小を伝えるには、数ありますか?

S3:マップでは、偽の貪欲を戦うためにまだ30最初のカッコウがあります。

 

おすすめ

転載: www.cnblogs.com/xqysckt/p/11390940.html