标签:
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 3551 | Accepted: 1440 |
Description
Input
Output
Sample Input
4 2 1 2 0 1 3 0 1 0 2 0 2 0 4 1 1 1 2 0 0 2 0 1 2 1 1 3 0 1 3 0
Sample Output
WIN WIN WIN LOSE WIN
Hint
Source
【思路】
SG函数。
把每个询问视作一组游戏,ans为每组游戏sg函数的xor值。
sg(x)=mex(S),其中mex(S)表示取后继集合所没有出现的sg值中最小的一个。
做这道题学到了一个有意思的经验:因为vis每一层dfs都会独立用到,所以如果放在dfs外面声明为全局变量的话vis就会被接下来的dfs所覆盖。
【代码】
1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<iostream> 5 #define FOR(a,b,c) for(int a=(b);a<(c);a++) 6 using namespace std; 7 8 const int N = 1000+10; 9 10 int n,m,sg[N]; 11 vector<int> G[N]; 12 13 int dfs(int u) { 14 if(sg[u]!=-1) return sg[u]; 15 int vis[N]; 16 memset(vis,0,sizeof(vis)); 17 FOR(i,0,G[u].size()) 18 vis[dfs(G[u][i])]=1; 19 for(int i=0;;i++) 20 if(!vis[i]) return sg[u]=i; 21 } 22 int main() { 23 while(scanf("%d",&n)==1) { 24 FOR(i,0,n) G[i].clear(); 25 int v; 26 FOR(i,0,n) { 27 scanf("%d",&m); 28 FOR(j,0,m) { 29 scanf("%d",&v); 30 G[i].push_back(v); 31 } 32 } 33 memset(sg,-1,sizeof(sg)); 34 while(scanf("%d",&m) && m) { 35 int ans=0,q; 36 FOR(i,0,m) 37 scanf("%d",&q) , ans^=dfs(q); 38 if(ans) puts("WIN"); else puts("LOSE"); 39 } 40 } 41 return 0; 42 }
标签:
原文地址:http://www.cnblogs.com/lidaxin/p/5171367.html