HDU 1524

思路:

算出来每个点的sg值,然后对于每个询问xor一下

//By SiriusRen
#include <cstdio>
#include <vector>
using namespace std;
const int N=1050;
int n,m,xx,yy,sg[N],vis[N],tmp[N];
vector<int>vec[N];
void dfs(int x){
    vis[x]=1;
    for(int i=0;i<vec[x].size();i++)dfs(vec[x][i]);
    for(int i=0;i<vec[x].size();i++)tmp[sg[vec[x][i]]]=1;
    for(int i=0;i<=n;i++)if(!tmp[i]){sg[x]=i;break;}
    for(int i=0;i<vec[x].size();i++)tmp[sg[vec[x][i]]]=0;
}
int main(){
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++){
            scanf("%d",&xx);
            while(xx--)scanf("%d",&yy),vec[i].push_back(yy);
        }
        for(int i=0;i<n;i++)if(!vis[i])dfs(i);
        for(int i=0;i<n;i++)vec[i].clear(),vis[i]=0;
        while(scanf("%d",&m)&&m){
            int ans=0;
            for(int i=1;i<=m;i++)scanf("%d",&xx),ans^=sg[xx];
            puts(ans?"WIN":"LOSE");
        }
    }
}

 

posted @ 2018-08-09 14:39 SiriusRen 阅读(...) 评论(...) 编辑 收藏