1531 樹上的博弈

2021-07-24 18:56:30 字數 1398 閱讀 1752

51nod  1531 樹上的博弈

樹型dp

1. 建樹,複雜度o(n)

2. 自下向上dp, 複雜度o(n)

記錄狀態量:   當前該棵子樹 分配m個數,答案是第k小數  。       進行狀態轉移

由於有先後手,並且有 分配希望 最大與最小 兩種前提。因此2*2=4種狀態,不過最大最小是對稱關係,因此可以只計算其中2種,另2種根據對稱求解。

轉移方程草稿:

c[root][++c[root][0]] = root_father; //為了計算方便,將0作為根節點的父節點

// c[root][0] = c[root][0] * 2 + 1;

// cout << "根"<= 0; --i)

*/}void test()

*/// cout << x << ':' << tree_size[x] << '\t' << result[x][0] << '\t' << result[root][1] << '\t' << result[x][2] << '\t' << result[x][3] << '\t' << endl;

// cout << root << endl;

printf("%d %d %d %d %d\n", tree_size[root], result[root][0], result[root][1], result[root][2], result[root][3]);

}int main()

51nod 1531 樹上的博弈

有一棵n個點的有根樹,他有m個葉子結點 葉子結點是那些沒有孩子的結點 邊由父親指向孩子。數字1到m被分配到每乙個葉子中。每乙個葉子有乙個數字,並且每乙個數字恰好被分配到乙個葉子中。剛開始的時候根部有乙個棋子。兩個玩家輪流移動棋子,每一步都會將這個棋子向他的某乙個孩子移動 如果玩家不能再移動棋子了,那...

牛客 樹上博弈 思維

題目大意 給出一棵樹,現在有兩個人在玩乙個遊戲,兩人依次在樹上行走,只能走沒有人的結點,無法行走的人失敗,題目需要我們求出有多少個初始點對,對於先手而言是必勝的情況 題目分析 其實稍微畫圖就能看出來,如果初始時兩個人之間的距離為偶數,那麼先手必勝,否則先手必敗,因為如果初始距離為偶數的話,那麼先手總...

HDU 5963 朋友 樹上博弈

給定一棵樹,樹中每一條邊有乙個權值為0或者1,每次遊戲需要找到乙個點,滿足該點到其父親的邊權為1,然後找到這個點到根節點的簡單路徑,將路徑上所有邊的權值翻轉。當一方無法操作時,另一方就獲勝。每次遊戲有m個操作,0 x表示指定x為根節點,要求輸出誰會贏 1 x y z表示將x和y之間的邊修改為z。本題...