题解 伊甸园日历游戏

这是一道 SG S G 函数的板子题。不知道的自行百度。

然后就是痛快的 SG S G 函数AC。

#include
using namespace std;
int SG[2221220];//等于1是对手下了这里有必胜策略
int Y,M,D;
const int inf =2221219;
inline int js(register int y,register int m,register int d){
    return (y-1899)*10000+m*100+d;
}
inline bool pd(register int y,register int m,register int d){
    if(y>=2002)return false;
    if(y>=2001&&m>=11&&d>4)return false;
    if(y<1900)return false;
    if(m>12)return false;
    if(m<=0)return false;
    if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
        if(d>=32)return false;
        else return true;
    }
    if(m==4||m==6||m==9||m==11){
        if(d>=31)return false;
        else return true;
    }
    if(m==2&&y%4==0&&y!=1900){
        if(d>=30)return false;
        else return true;
    }
    if(m==2&&d>=29)return 0;
    return 1;
}
inline int jf(register int y,register int m,register int d){
    if(pd(y,m,d+1)){
        return js(y,m,d+1);
    }
    if(pd(y,m+1,1)){
        return js(y,m+1,1);
    }
    if(pd(y+1,1,1))return js(y+1,1,1);
    return inf;
}
inline int bf(register int y,register int m,register int d){
    if(pd(y,m+1,d)){
        return js(y,m+1,d);
    }
    if(m==12)if(pd(y+1,1,d))return js(y+1,1,d);
    return inf;
}
inline int mex(register int a){
    if(a==0)return 1;
    else return 0;
}
inline int mex2(register int a,register int b){
    if(a>b)swap(a,b);
    if(a>=1)return 0;
    if(b==1)return 2;
    else return 1;
}
int main(){
    //freopen("calendar.in","r",stdin);
    //freopen("calendar.out","w",stdout);
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while(T--){
        cin>>Y>>M>>D;
        memset(SG,1,sizeof(SG));
        //SG[2221219]=1;

        register int STD=js(2001,11,4);
        SG[STD]=0;
        for(register int i=2001;i>=Y;--i){
            for(register int j=12;j>=1;--j){
                for(register int k=31;k>=1;--k){
                    if(!pd(i,j,k))continue;
                    register int a=jf(i,j,k),b=bf(i,j,k);
                    if(a>STD&&b>STD)continue;

                    if(a>STD){SG[js(i,j,k)]=mex(SG[b]);continue;}
                    if(b>STD){SG[js(i,j,k)]=mex(SG[a]);continue;}
                    SG[js(i,j,k)]=mex2(SG[a],SG[b]);
                }
            }
        }
        if(SG[jf(Y,M,D)]==0||SG[bf(Y,M,D)]==0){
            puts("YES");
        }
        else puts("NO");
    }
}

你可能感兴趣的:(博弈,题解)