現有乙個 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. $
一行乙個整數,代表答案。
31 2
2
當且僅當牛牛在1號點,牛妹在3號點,或者牛牛在3號點,牛妹在1號點時,牛牛才獲勝。
首先自己輸掉的唯一方法是自己在葉節點,而另乙個人在該葉節點的父節點上。
此時兩人的距離d為奇數。
兩人的距離d為奇數時,a先走使得兩個人的距離d減小(也就是往根節點走)。
b也可以採取同樣的策略使得兩人的距離d減小,
最後會到兩人的距離為1,該a走。
此時a只能往葉節點走,b只要跟著a往葉節點走就能獲勝。
偶數的情況同理。
所以該題只要計算一下每個結點的深度即可。
1 #include23using
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...