题意是: 日历翻页, 可以翻到下一天,也可以翻到下一个月的同一天, 如果没有同一天就不能翻, 其实日期 1900 1 1 结束日期 2001 11 4 。
由于 状态比较少 , 直接 DP 就可破。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <assert.h>
#include <queue>
#define REP(i,n) for(int i=0;i<n;i++)
#define TR(i,x) for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define ALLL(x) x.begin(),x.end()
#define SORT(x) sort(ALLL(x))
#define CLEAR(x) memset(x,0,sizeof(x))
#define FILLL(x,c) memset(x,c,sizeof(x))
using namespace std;
const double EPS = 1e-8;
#define LL long long
#define pb push_back
int d[210][13][32];
int dat[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int a){
if((a%4==0 &&a%100)||(a%400==0)){
return true;
}
return false;
}
int a,b,c;
void next_day(int y,int m,int day){
if(day == dat[m]){
if(m ==12){
a= y+1;
b= 1;
c =1;
return;
}else{
a =y;
b = m+1;
c =1;
return ;
}
}else{
a = y;
b = m;
c =day+1;
}
}
bool next_month(int y,int m,int day){
if(m==12){
a= y+1;
b= 1;
c = day;
return true;
}else{
if(day<=dat[m+1]){
a = y;
b = m+1;
c = day;
return true;
}
return false;
}
}
void init(){
d[201][11][4] = 0;
d[201][11][3] = 1;
d[201][11][2] = 0;
d[201][11][1] = 1;
for(int j=10;j>=1;j--){
int k = j;
int i = 201 ;
// cout << k<<" ** "<<dat[k]<<endl;
for(int p = dat[k];p>=1;p--){
int ans = 1;
next_day(i,k,p);
ans&= d[a][b][c];
// cout << p<<""<<endl;
if(next_month(i,k,p)){
ans&=d[a][b][c];
// cout << a <<b<<c << " "<<i<<k<<p<<endl;
}
ans ^=1;
d[i][k][p] =ans;
}
}
for(int i= 200;i>=100;i--){
if(judge(i+1800)){
dat[2] =29;
}else{
dat[2] =28;
}
for(int j=12;j>=1;j--){
int k = j;
//cout << " ** "<<dat[k]<<endl;
for(int p = dat[k];p>=1;p--){
int ans = d[i][k][p];
// cout << i <<" "<< k<<" "<< p<<endl;
next_day(i,k,p);
ans&= d[a][b][c];
if(next_month(i,k,p)){
ans&=d[a][b][c];
}
ans ^=1;
d[i][k][p] =ans;
}
}
}
}
int main(){
for(int i=1;i<210;i++){
for(int j=1;j<=12;j++){
for(int k = 1;k<=31;k++){
d[i][j][k] = 1;
}
}
}
init();
int n;
cin>>n;
while(n--){
int aa,bb,cc;
scanf("%d%d%d",&aa,&bb,&cc);
if(d[aa-1800][bb][cc]){
puts("YES");
}else{
puts("NO");
}
}
return 0;
}