萌新求助 想不通为什么会RE QAQ
查看原帖
萌新求助 想不通为什么会RE QAQ
790282
Ribaudiaux楼主2022/12/1 21:46
#include<bits/stdc++.h>
using namespace std;
int ans[2010][13][32];
bool acs[2010][13][32];
bool big[13]={0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1};
bool small[13]={0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0};
bool run(int y){
    if(y%100==0&&y%400==0) return 1;
    if(y%100!=0&&y%4==0) return 1;
    return 0;
}
bool dfs(int y, int m, int d){
    if(y>=2006&&m>=11&&d>=4) return 1;
    //already known
    if(acs[y][m][d]) return ans[y][m][d];
    //not known yet
    //illegal
    if(d==31&&small[m]){
        ans[y][m][d]=1;
        acs[y][m][d]=1;
        return 1;
    }
    else if(m==2){
        if(run(y)&&d==30){
            ans[y][m][d]=1;
            acs[y][m][d]=1;
            return 1;
        }
        else if(!run(y)&&d==29){
            ans[y][m][d]=1;
            acs[y][m][d]=1;
            return 1;
        }
    }
    //legal
    int lm=m+1, ly=y, ld=d;//month++
    if(lm==13){
        lm=1; ly++;
    }
    int ry=y, rm=m, rd=d+1;//date++
    if(rd==32&&big[rm]){
        rd=1; rm++;
        if(rm==13){
            rm=1; ry++;
        }
    }
    else if(rd==31&&small[rm]){
        rd=1; rm++;
    }
    else if(rm==2){
        if(rd==30&&run(ry)){
            rd=1; rm++;
        }
        else if(rd==29&&!run(ry)){
            rd=1; rm++;
        }
    }
    //try to know
    if(dfs(ly, lm, ld)&&dfs(ry, rm, rd)){
        ans[y][m][d]=0;
        acs[y][m][d]=1;
        return 0;
    }
    else{
        ans[y][m][d]=1;
        acs[y][m][d]=1;
        return 1;
    }
}
int  main(){
    int x, y, z;
    ans[2006][11][4]=0;
    acs[2006][11][4]=1;
    int q;
    scanf("%d", &q);
    dfs(1900, 1, 1);
    while(q--){
        scanf("%d %d %d", &x, &y, &z);
        if(ans[x][y][z]) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
2022/12/1 21:46
加载中...