给出
n
≤
1
e
6
n\leq1e6
n≤1e6的树,然后两个人玩博弈游戏,每次可以选择若干的叶子结点把它删掉。
如果只有一条链的情形,取决于奇偶性。
如果某一条链的链底的父亲有超过两个儿子,那么此时相当于可以改变一次奇偶性,所以这样的状态是必胜态。
否则就判断所有的叶子节点到最近的出度大于2的祖先的链长,当且仅当所有链长均为偶数的时候是必败的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=1e6+3;
vector<int> go[N];
int deg[N];
int dep[N];
bool win,odd_link;
void dfs(int u,int fa) {
dep[u]=dep[fa]+1;
for(auto &v:go[u]) {
if(deg[u]>=2) { dep[u]=0; }
dfs(v,u);
}
if(go[u].size()==0) {
if(deg[fa]>=2) {
win=1;
}
if(dep[u]%2==1) {
odd_link=1;
}
}
}
void clear(int n) {
for(int i=1;i<=n;i++) {
go[i].clear();
deg[i]=0;
dep[i]=0;
}
win=0;
odd_link=0;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n;
scanf("%d",&n);
clear(n);
for(int i=2;i<=n;i++) {
int u;
scanf("%d",&u);
go[u].push_back(i);
deg[u]++;
}
dfs(1,0);
if(win) puts("Takeru");
else {
if(odd_link) puts("Takeru");
else puts("Meiya");
}
}
return 0;
}