可惜没如果=_=
时光的河入海流

题目链接在这里:Problem - K - Codeforces

这题是一道很好的树上博弈的题目,关于博弈论的问题,要先从简单的特殊情况入手,找到一些必胜或者必败的局面,再慢慢推到复杂的情况。因为复杂的状态都是由简单的状态叠加起来的。

关于此题的题解可以看这个博客:(7条消息) MUV LUV UNLIMITED(树上博弈 奇偶性)_jkchen's Haven-CSDN博客

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=2e6+5;
 4 int t,n;
 5 int tot,head[MAX],adj[MAX],nxt[MAX],son[MAX];
 6 bool flag,ff[MAX];
 7 void addedge(int u,int v){
 8     tot++;
 9     adj[tot]=v;
10     nxt[tot]=head[u];
11     head[u]=tot;
12 }
13 void dfs(int x,int deep){
14     //cout<<x<<endl;
15     int i,j,zt=0;
16     if (x==1){
17         if (son[x]==1) deep++;
18         if ((deep-1)%2==1) flag=false;
19         return;
20     }
21     if (son[x]>1){
22         if ((deep-1)%2==1) flag=false;
23         return;
24     }
25     dfs(adj[head[x]],deep+1);
26 }
27 int main(){
28     freopen ("k.in","r",stdin);
29     freopen ("k.out","w",stdout);
30     int i,j;
31     scanf("%d",&t);
32     while (t--){
33         scanf("%d",&n);tot=0;
34         for (i=1;i<=n;i++) son[i]=head[i]=0;
35         for (i=2;i<=n;i++){
36             scanf("%d",&j);
37             addedge(i,j);
38             //cout<<i<<"-->"<<j<<endl;
39             son[j]++;
40         }
41         flag=true;
42         for (i=1;i<=n;i++)
43             if (son[i]==0)
44                 dfs(i,1);
45         if (flag) printf("Meiya\n");
46         else printf("Takeru\n");
47     }
48     return 0;
49 }

 

posted on 2021-08-06 22:55  珍珠鸟  阅读(43)  评论(0编辑  收藏  举报