#(DP +ツリーおよび除外)ロックウェル谷P3047 [USACO12FEB]近隣ウシ近い牛

タイトル説明

ファーマージョンは彼の牛は、多くの場合、近くのフィールド間を移動することに気づきました。これを考慮して、彼はその場で最初に位置する牛のため、だけでなく、近くのフィールドから訪れる牛のためだけでなく、彼の各フィールドに十分な草を植えたいと考えています。

具体的には、FJの農場は、フィールドのいくつかのペアが双方向トレイル(N-1それらの合計)に接続されたN個のフィールド(1 <= N <=10万)、から成ります。任意の2つのフィールド間i、jは、iとjの間を結ぶトレイルで構成されたユニークなパスが存在するようにFJは、ファームを設計しました。牛が時々(1 <= K <= 20)トレイルをKまで交配することによって異なるフィールドに移動がフィールドiが、C(I)牛に家です。

つまり、潜在的に私は、最大で次のようでフィールドに到達することができます牛の数 - FJは、私はおそらくそのフィールドに終わる可能性乳牛の最大数、M(i)を、供給するために各フィールドに十分な草を植えたいですKトレイル。FJの農場の構造および各フィールドのC(i)の値を考えると、私は、FJは、フィールド毎のI M(i)を計算する助けてください。

ファーマージョンは彼の牛は、多くの場合、近くのフィールド間の移動に気づきました。このことを念頭に置いて、彼はこの土地に最初の牛のためだけでなく、放牧牛のためだけでなく、すべての土地に十分な草を植えてみたかった近くのフィールドから行きます。

具体的には、N個のブロック(1 <= N <=10万)で構成FJファームフィールドは、二つのフィールドのそれぞれの間に側への接続(N-1辺の合計)が存在しません。FJデザインファーム、任意の二つのフィールドiとjの間で、iとjを結ぶ唯一の道があります。時には様々な他のフィールドK(1 <= K <= 20)を介して到着したが、フィールドブロックiは、C(I)の滞留牛、乳牛です。

FJは草を食べM(I)の牛も、各フィールドに植えたいと思います。M(i)は、この点牛までのk個のステップの後に到達させることができる他のポイントの数を指します。

牛のFJ数は、現在、各フィールドのために与えられている、M(i)の各フィールドに対して計算FJを助けてください。

入力形式

* 1行目:二スペースで区切られた整数、NとK.

*行2..N:各行は、iとj(1 <= I、J <= N)がフィールドiおよびjは直接歩道で接続されていることを示す、2スペースで区切られた整数を含みます。

*行N + 1..2N:行N + iは整数C(i)を含んでいます。(0 <= C(I)<= 1000)

最初のライン:nおよびK。

後ろN-1行目:iおよびj(二つのフィールド)。

行の後、N:C(I)の1..nの各ブロック。

出力フォーマット

*行1..N:ライン私はM(i)の値を含める必要があります。

n行:各ラインM(I); //私は:1..2

サンプル入力と出力

入力#1
6 2 
5 1 
3 6 
2 4 
2 1 
3 2 
1 
2 
3 
4 
5 
6
出力#1
15 
21 
16 
10 
8 
11

説明/ヒント

6コースは、(5,1)、(3,6)、(2,4)、(2,1)を接続するとともにフィールド、および(3,2)があります。フィールドiはC(I)= I牛を有しています。

フィールド1はM(1)2コースの距離内に15頭の牛=、等を有しています

説明タイトル:n個の点の木所与は、各点がC_I牛を有し、牛は、各ステップkの範囲内でどのように各点を尋ねました。

@Slager_Z翻訳をありがとう

この質問は暴力のようですか?(*╹▽╹*)

ポジティブなソリューション:可動規制ツリー(〃 '▽' 〃)

分析:

トピック説明:木の少し右を与え、すべての右のポイント範囲とノードk個のステップを尋ねました。

状態設計:[i]の[j]はiの宛先ノードによって表されるfをしましょう、すべてのノードがK-外向きの拡張はして到達することができます!

焦点は、状態遷移方程式を考えることです。自由縁部にN-1の合計ので、ツリー構造を構成することは明らかです。その後〜ノードxを考えると、彼のすべてのノードは、それに接続されています

ターゲットノードとしてXに[X] [K] fを考慮する、Kステップ以内に開始する権利を指すことができ、次いで、xの状態が彼の隣接ノードから転送されなければなりません

XN .... X接続点X1、X2、X3を考えてみましょう。

X1方向に伸長ステップを解くX kは、K-1、状態記載X1から転送され、さらに外側に拡張することができます!

しかし、問題は、それがF [X1]が[K-1]もあるのみ全ての距離x1とkより大きくない後点を右に延びる、X1にX方向に寄与しています。

反対側の後、つまり、方向X1->のxのから、x1が位置xに行ってきました、K-2を広めるために続けることができる距離がまだあります!

即ち、F [X1] [K-1]を算出繰り返しF [X] [K-2]はXの全ての値を削除する--- X1方向の(それはサブツリーX1のルートノードです)!

だから、これはそう、それぞれの息子はK-2欠失算出ステップを有し、そのノードユニコム、方向(サブツリー)の全てを介して転送することにより、状態点x、

最後に、それぞれが正の解を減算することによって得ることができる、算術オーバーフローの[X] [K-2] Fソン[X] -1タイムアウト以上になります!

実際には、包除原理は、ここでQAQを使用〜

簡潔には、Aの存在下、B、C、三組

次いでA∪B∪C= A + B +CA∩BA∩CB∩C+A∩B∩C。

(ハンド)* ^▽^ *(それを理解するためにベン図をアニメーション)

状態遷移方程式は、K> 1つのときF [X] [K] =のΣf[XI] [K-1] - (SON [X] -1)* F [X] [K-2]。

        k = 1のとき:[X] F [K] =のΣf[XI] [K-1] + F [X] [0];(この時刻k-2 <0、Fの非存在下で、[X] [K-2 】オーバーフロー〕及びK = 2は、Fの存在が[X] [0]二重カウントである場合)

#include <iostreamの>
する#include <cstdioを>
使用して名前空間STD;
intは、K、F [100001] N- [21である]; //
INT A、B、sonnum [100001];上記の各要素の//意味
構造体のエッジ{ //
INT次に; //ツリー記憶隣接テーブル
にINTを;
};
エッジE [200000]; //
INTヘッド[200001]、NUM; //
空隙addedge(INTから、intへの)//
{
E [+ //; NUM +]は]から[.nextヘッド=
//隣接テーブル、E [NUM] .TO =へ
= NUMから[ヘッド; //
}
int型のmain()
{
scanfの( "%Dの%のD"、 &)N-、&K; //
用(INT I = 1; I <= N - 1; I ++)//
{
scanfの( "%のDの%のD"、&A、&B); //
addedge(A、B)/ / NOは、図に二つの方向が維持されていない一度
addedge(B、A); //
sonnum [B] ++; //リンク点+ +1の各点
sonnum [A] ++; //
}
以下のために(INT i = 1; iが <= N; iは++)// 、すなわち、ゼロのステップに行くために初期化自体の各ノード点右
scanfの( "%のD"、&F [I] [0]);
// DP
用(I = 1をint型;私は< = kは、私は++)// DP のステージを!DP段階であることを行くためのステップ数!
(INT J = 1; jに対して <= N; J ++)// 各ノード列挙DP用
{
用(INTヘッドT = [J]; T; T = E [T] .next)ノードI //列挙すべてのノードユニコム
{
F [J] [I]は+ = F [E [T] .TO] [-I 1]; //累積寄与ユニコムポイントは、複製
}
(I> 1)IF
F [J ] [1] - = F [ j]は[I-2] *(sonnum [J] -1); // 算術オーバーフロー、反復された部分が失われた場合に

F [J] [1] + = F [Jを。 ] [0]; //オーバーフローは、次にちょうどそれ自体ポイントを追加しない場合
}
ため(INT 1 = I; I <= N - 、Iは++)//
のprintf( "%Dの\のN-"、F [I] [K ]); //出力
戻り0;
}

-終わり-

 

おすすめ

転載: www.cnblogs.com/little-cute-hjr/p/11403267.html