2020牛客寒假演算法基礎集訓營4 F樹上博弈

2022-08-10 16:51:19 字數 1491 閱讀 6252

現有乙個 n 個點,n-1條邊組成的樹,其中 1 號點為根節點。

牛牛和牛妹在樹上玩遊戲,他們在遊戲開始時分別在樹上兩個不同的節點上。

在遊戲的每一輪,牛牛先走一步,而後牛妹走一步。他們只能走到沒有人的空節點上。如果誰移動不了,就輸掉了遊戲。現在牛牛和牛妹決定隨機選擇他們分別的起點,於是他們想知道,有多少種遊戲開始的方式,使得牛牛存在一種一定獲勝的最優策略。

兩種開始方式相同,當且僅當在兩種開始方式中牛牛,牛妹的開始位置是分別相同的,否則開始方式就被視作不同的。

第一行輸入為乙個整數 n,代表樹的點數。

第二行n-1個整數$ p_2,p_3,...,p_n $,分別代表2,3,...,n號點的父節點編號。

$ n\leq 10^6,1 \leq p_i< i. $

一行乙個整數,代表答案。
3

1 2

2

當且僅當牛牛在1號點,牛妹在3號點,或者牛牛在3號點,牛妹在1號點時,牛牛才獲勝。
首先自己輸掉的唯一方法是自己在葉節點,而另乙個人在該葉節點的父節點上。

此時兩人的距離d為奇數。

兩人的距離d為奇數時,a先走使得兩個人的距離d減小(也就是往根節點走)。

b也可以採取同樣的策略使得兩人的距離d減小,

最後會到兩人的距離為1,該a走。

此時a只能往葉節點走,b只要跟著a往葉節點走就能獲勝。

偶數的情況同理。

所以該題只要計算一下每個結點的深度即可。

1 #include2

3using

namespace

std;45

const

int n = 1e6 + 10;6

7struct

node8;

1213

node t[n];

14int

head[n];

15bool

vis[n];

16int

d[n];

1718

inttot;

19void addedges(int u, int

v)20

25void dfs(int

x)2637}

38}39int

main()

4041

50 dfs(1

);51

52long

long a = 0;53

long

long b = 0;54

for(int i = 1; i <= n; i++)

5561 printf("

%lld\n

", (a - 1)*a + (b - 1)*b );

62 }

2020牛客寒假演算法基礎集訓營

長期更新,補完為止 2 g 判正誤 題意 t組資料。判斷a d b e c f是否等於g。1e9 a,b,c,g 1e9,0 d,e,f 1e9。保證不會出現指數和底數同為 0 的情況。思路 硬算會tle或mle。快速冪取模,為了增加過題概率,多取幾個模數判斷。includeusing namesp...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...

2020牛客寒假演算法基礎集訓營1

h題 突然發現h題可以用好多種方法做的。方法一 雙指標,維護乙個修改次數小於等於k的區間 include using namespace std typedef long long ll const int mod 1e9 7 const int n 1e5 5 const int inf 0x3f...