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博弈)相关的知识,希望对你有一定的参考价值。
当选择了区间 [ 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 115 题解