HDU 4515
用数组记录时间。
O(n)打表,O(1)查询。
#include<iostream>
#include<iomanip>
using namespace std;
const int MAX=2e5+5;
const int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const int leap_mon[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
struct date_{
int year,month,day;
}date[MAX];
bool judge(int year){
if((year%4==0&&year%100!=0)||year%400==0)
return 1;
return 0;
}
int main(){
date[MAX/2].year=2013;
date[MAX/2].month=3;
date[MAX/2].day=24;
date[MAX/2+1]=date[MAX/2];
date[MAX/2-1]=date[MAX/2];
for(int i=MAX/2+1;i<MAX;i++){
date[i].day++;
if(date[i].day>mon[date[i].month]&&!judge(date[i].year))
date[i].day=1,date[i].month++;
else if(judge(date[i].year)&&date[i].day>leap_mon[date[i].month])
date[i].day=1,date[i].month++;
if(date[i].month>12)
date[i].month=1,date[i].year++;
date[i+1]=date[i];
}
for(int i=MAX/2-1;i>=0;i--){
date[i].day--;
if(date[i].day<1&&!judge(date[i].year)){
int tp=date[i].month;
if(tp-1<1)
tp=13;
date[i].day=mon[tp-1],date[i].month--;
}
else if(date[i].day<1){
int tp=date[i].month;
if(tp-1<1)
tp=13;
date[i].day=leap_mon[tp-1],date[i].month--;
}
if(date[i].month<1)
date[i].month=12,date[i].year--;
date[i-1]=date[i];
}
int n,ca;
cin>>ca;
while(ca--&&cin>>n){
cout<<date[MAX/2+n].year;
cout<<"/"<<setw(2)<<setfill('0')<<date[MAX/2+n].month;
cout<<"/"<<setw(2)<<setfill('0')<<date[MAX/2+n].day<<" ";
cout<<date[MAX/2-n].year;
cout<<"/"<<setw(2)<<setfill('0')<<date[MAX/2-n].month;
cout<<"/"<<setw(2)<<setfill('0')<<date[MAX/2-n].day<<endl;
}
}