题目链接:http://code.bupt.edu.cn/problem/p/427/
一个很单纯的every-sg模型
代码:
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#define N 100010
using namespace std;
int step[N];
int sg[N];
int stone[N];
vector<int> g[N];
int mex(int a)
{
if(g[a].empty()) return 0;
if(sg[a]!=-1)
return sg[a];
int test=0;
for(int i=0;i<g[a].size();i++)
{
if(sg[g[a][i]]==0)
test=1;
else if(sg[g[a][i]]==-1)
return mex(g[a][i]);
}
return test;
}
int find_step(int a)
{
if(g[a].empty()) return 0;
if(step[a]!=-1) return step[a];
int ma=0,mi=999999;
for(int i=0;i<g[a].size();i++)
{
if(sg[a]==1)
{
if(!sg[g[a][i]])
ma=max(ma,find_step(g[a][i]));
}
else
{
if(sg[g[a][i]])
mi=min(mi,find_step(g[a][i]));
}
}
if(sg[a])
return ma+1;
else
return mi+1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(step,-1,sizeof(step));
memset(sg,-1,sizeof(sg));
for(int i=0;i<N;i++)
g[i].clear();
int n,m;
int num;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++)
{
scanf("%d",&num);
g[num].push_back(i);
}
for(int i=0;i<m;i++)
scanf("%d",&stone[i]);
for(int i=n;i>=1;i--)
{
sg[i]=mex(i);
//cout<<sg[i]<<endl;
}
for(int i=1;i<=n;i++)
{
step[i]=find_step(i);
//cout<<step[i]<<endl;
}
int ans=0;
for(int i=0;i<m;i++)
{
ans=max(ans,step[stone[i]]);
}
if(ans%2)
printf("MengMengDa!\n");
else
printf("So sad...\n");
}
return 0;
}原文地址:http://blog.csdn.net/u013912596/article/details/37919813