第2到第8数据正确,但第一个有问题。 我试过样例三,数据长起来输出全是0。 不知道哪里的问题求教。 最后两个TLE可以先不管它。
/*
思路是先把所有的数据读入,按ri排序选最大的只进行一次数日期。
然后再按读入的顺序排序,再输出。
*/
#include<bits/stdc++.h>
using namespace std;
long long mo[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
long long d=1,m=1,y=4713;
struct q{
long long ri,d,m,y,i;//分别为 多少天 是几号 几月 那一年 第几个输入
bool k;//k判断是否为公元后
}a[100010];
bool gongyuanhou=false; //是否为公元后
bool run(int y) //判断闰月
{
if(gongyuanhou&&y>1582) return y%400==0||(y%4==0&&y%100!=0);
else if(gongyuanhou) return y%4==0;
else return (y-1)%4==0;
}
bool cmp1(q x,q y)//按数如的ri排序
{
return x.ri<y.ri;
}
bool cmp2(q x,q y)//按序号排序
{
return x.i<y.i;
}
int main()
{
long long Q,t=0,num=1;
scanf("%lld",&Q);
for(int i=1;i<=Q;i++)
{
scanf("%lld",&a[i].ri);
a[i].i=i;//记录为第几个输入的,以便待会输出
}
sort(a+1,a+Q+1,cmp1);
long long k=a[Q].ri;//k为ri中最大的,这样就只用数一次
while(t<k)
{
t++;
if(y==1582&&gongyuanhou&&m==10&&d==4) d+=11;
else d++;
if(m==2&&run(y)) mo[2]=29;//闰月
else mo[2]=28;
if(d>mo[m]) //月份进
{
m++;d=1;
}
if(m>12)//年份进,分为公元前和公元后
{
if(gongyuanhou)//公元后加年份
{
y++;m-=12;
}
else//减年份
{
y--;m-=12;
}
}
if(y==0)//减到0年了
{
y++;gongyuanhou=true;
}
while(t==a[num].ri)//如果为对应的ri,记录。
{
a[num].d=d;
a[num].m=m;
a[num].y=y;
a[num].k=gongyuanhou;
num++;
}
}
sort(a+1,a+Q+1,cmp2);//按序号排回来
for(int i=1;i<=Q;i++)//输出
{
if(a[i].k) printf("%lld %lld %lld\n",a[i].d,a[i].m,a[i].y);
else printf("%lld %lld %lld BC\n",a[i].d,a[i].m,a[i].y);
}
return 0;
}