qscoj 喵哈哈村的盧西奧

2021-07-28 13:36:04 字數 1136 閱讀 2433

描述為了拯救喵哈哈村,這個世界必須要存在英雄。

一名叫做盧西奧的英雄站了出來!他現在面臨乙個難題:

他被要求將一棵樹拆成3份,使得每乙份中所有節點的權值和相等。

他希望知道,對於一棵給定的有根樹,在選取其中2個非根節點並將它們與它們的父親節點分開後,所形成的三棵子樹的節點權值之和能夠兩兩相等的方案有多少種。

兩種方案被看做不同的方案,當且僅當形成方案的2個節點不完全相同。

輸入每個輸入檔案包含多組輸入,在輸入的第一行為乙個整數t,表示資料的組數。

每組輸入的第一行為乙個整數n,表示給出的這棵樹的節點數。

接下來n行,依次描述結點1~n,其中第i行為兩個整數vi和pi,分別描述這個節點的權值和其父親節點的編號。

父親節點編號為0的節點為這棵樹的根節點。

滿足3<=n<=100000, |vi|<=100, t<=10

輸出對於每組輸入,輸出一行ans,表示方案的數量。

樣例輸入1

複製

2

31 0

1 11 2

41 0

1 11 2

1 3

樣例輸出1

1

0

sum[u]:以u點為根的子樹所有節點權值之和

樹的總權值為sum[root],既然是平均分成三分那麼每一分的值一定是sum[root]/3

總共有兩種情況:

①兩個切割點屬於不同子樹

②其中乙個切割點在以另乙個切割點為根的子樹中

對於①:深蒐時統計一下就好了

對於②:即是需要找到乙個點sum[x] = sum[root]*2/3,並且在以x點為根的子樹中有點滿足sum[p] = sum/3,也在深 搜

時統計一下就好

#include#include#includeusing namespace std;

#define ll long long

vectorg[100005];

ll ans, sum[100005], df, sa;

int root, n, val, pri[100005];

ll jud(int u, int p)

{ int i, v;

sum[u] += pri[u];

for(i=0;i

喵哈哈村的盧西奧

描述 為了拯救喵哈哈村,這個世界必須要存在英雄。一名叫做盧西奧的英雄站了出來!他現在面臨乙個難題 他被要求將一棵樹拆成3份,使得每乙份中所有節點的權值和相等。他希望知道,對於一棵給定的有根樹,在選取其中2個非根節點並將它們與它們的父親節點分開後,所形成的三棵子樹的節點權值之和能夠兩兩相等的方案有多少...

qscoj 喵哈哈村的盧西奧 樹形DP難)

描述為了拯救喵哈哈村,這個世界必須要存在英雄。一名叫做盧西奧的英雄站了出來!他現在面臨乙個難題 他被要求將一棵樹拆成3份,使得每乙份中所有節點的權值和相等。他希望知道,對於一棵給定的有根樹,在選取其中2個非根節點並將它們與它們的父親節點分開後,所形成的三棵子樹的節點權值之和能夠兩兩相等的方案有多少種...

qscoj 喵哈哈村的狼人殺大戰 5

描述喵哈哈村最近熱衷於玩乙個叫做狼人殺的遊戲!沈寶寶同學今天他抽到的是狼人的身份,按照他的一貫玩法,他喜歡一開始就自爆,讓大家都不能說話,可謂心狠手辣。於是他早早的就出去了。但是他現在很無聊,於是他出了一道題給自己玩。如果乙個數的二進位制表示中有k個1的話,那麼這個就是就是k th數。比如有10 1...