描述為了拯救喵哈哈村,這個世界必須要存在英雄。
一名叫做盧西奧的英雄站了出來!他現在面臨乙個難題:
他被要求將一棵樹拆成3份,使得每乙份中所有節點的權值和相等。
他希望知道,對於一棵給定的有根樹,在選取其中2個非根節點並將它們與它們的父親節點分開後,所形成的三棵子樹的節點權值之和能夠兩兩相等的方案有多少種。
兩種方案被看做不同的方案,當且僅當形成方案的2個節點不完全相同。
輸入每個輸入檔案包含多組輸入,在輸入的第一行為乙個整數t,表示資料的組數。
每組輸入的第一行為乙個整數n,表示給出的這棵樹的節點數。
接下來n行,依次描述結點1~n,其中第i行為兩個整數vi和pi,分別描述這個節點的權值和其父親節點的編號。
父親節點編號為0的節點為這棵樹的根節點。
滿足3<=n<=100000, |vi|<=100, t<=10
輸出對於每組輸入,輸出一行ans,表示方案的數量。
樣例輸入1
複製
231 0
1 11 2
41 0
1 11 2
1 3
樣例輸出1
10
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...