AtCoder Beginner Contest 206(Sponsored by Panasonic) F - Interval Game 2(nim博弈)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 206(Sponsored by Panasonic) F - Interval Game 2(nim博弈)相关的知识,希望对你有一定的参考价值。

LINK

当选择了区间 [ L , R ) [L,R) [L,R)时,若某个区间与 [ L , R ) [L,R) [L,R)相交那就再也不能选了

整个局面相当于分割为两个独立的局面,就是在区间 [ 1 , L ] [1,L] [1,L]和区间 [ R , 100 ] [R,100] [R,100]的游戏

多个独立的游戏可以用 n i m nim nim博弈来确定胜负

所以递归一下就可以得到解了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 109;
int n,m,L[maxn],R[maxn],f[maxn][maxn];
bool vis[maxn][maxn];
vector<int>vec[maxn];
int solve(int l,int r)
{
	if( l>r )	return 0;//必败
	if( vis[l][r] )	return f[l][r];
	vis[l][r] = 1;
	int temp[102] = {0}; 
	for(int ll=l;ll<=r;ll++)
	for(auto rr:vec[ll] )
	{
		if( rr<=r )
			temp[solve(l,ll)^solve(rr,r)] = 1;
	}
	for(int i=0;i<=101;i++)
		if( !temp[i] )	return f[l][r] = i;
	return f[l][r];
}
int main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n;
		for(int i=1;i<=100;i++)	vec[i].clear();
		memset( vis,0,sizeof vis ); memset( f,0,sizeof f );
		for(int i=1;i<=n;i++)
		{
			cin >> L[i] >> R[i];
			vec[L[i]].push_back( R[i] );
		}
		printf( solve(1,100)>0?"Alice\\n":"Bob\\n");
	}
	return 0;
}

以上是关于AtCoder Beginner Contest 206(Sponsored by Panasonic) F - Interval Game 2(nim博弈)的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242