Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

AC代码+讲解

Posted by FanyuX at 2023-12-17 16:39:26 on Problem 2425
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define ll long long
#define ri register
#define pii pair<int,int>
const int inf=0x3f3f3f3f;
const int N=1e6+5;
int n,m,u,sg[N];
vector<int>e[N];
bool vis[N],bar[N];
int SG(int x) {
	if(vis[x])return sg[x];
	vis[x]=1;
	int v;
	for(int i=0;i<e[x].size();i++)
		v=e[x][i],SG(v);//用vector存图,因为没有具体说明边的数目
	memset(bar,0,sizeof bar);
	for(int i=0;i<e[x].size();i++)
		v=e[x][i],bar[SG(v)]=1;
	if(!e[x].size())return sg[x]=0;
	for(int i=0;;i++)
		if(!bar[i])return sg[x]=i;//这部分相当于取mex
}
signed main() {
	while(~scanf("%d",&n)) {
		memset(vis,0,sizeof vis);
		memset(sg,0,sizeof sg);
		for(int i=1;i<=n;i++) {
			scanf("%d",&m);
			while(m--)scanf("%d",&u),e[i].push_back(u+1);
		}
		while(1) {
			scanf("%d",&m);
			if(!m)break;
			int ans=0;
			while(m--)scanf("%d",&u),ans^=SG(u+1);
			if(!ans)printf("LOSE\n");
			else printf("WIN\n"); 
		}
		for(int i=1;i<=n;i++)e[i].clear();
	}
	return 0;
}
本题其实是SG函数的模板题目
对于SG函数的证明可以借鉴于Nim游戏的证法,具体的可以看OIwiki

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator