求助 S 组 T1
  • 板块学术版
  • 楼主AuKr
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/11/10 23:26
  • 上次更新2023/11/5 08:18:00
查看原帖
求助 S 组 T1
317568
AuKr楼主2020/11/10 23:26

rt,只有 30 分

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<ctime>
#define ll long long
#define N number_
#define M number_
using namespace std;

#define MAXN 4000005
#define read(x) scanf("%d",&x)

int q;
ll x;
int lsd,lsm,lsy;
struct node
{
	int y,m,d;
}ans[MAXN];

int main()
{
	//freopen("julian.in","r",stdin);
	//freopen("julian.out","w",stdout);
	int d=1,m=1,y=-4713;
	for(int i=1;i<=1721424;i++)
	{
		d++;
		if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
		{
			if(d==32) d=1,m++;
		}
		else if(m!=2)
		{
			if(d==31) d=1,m++;
		}
		else
		{
			if((-y)%4==1&&d==30)
			{
				d=1,m=3;	
			}
			else if((-y)%4!=1&&d==29)
			{
				d=1,m=3;
			}
		}
		if(m>12) m=1,d=1,y++;
		ans[i].d=d,ans[i].y=y,ans[i].m=m;
	}
	ans[1721424].y=1;
	y=1,d=1,m=1;
	for(int i=1721425;i<=2299160;i++)
	{
		d++;
		if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
		{
			if(d==32) d=1,m++;
		}
		else if(m!=2)
		{
			if(d==31) d=1,m++;
		}
		else
		{
			if(y%4==0&&d==30) d=1,m=3;
			else if(y%4!=0&&d==29) d=1,m=3;
		}
		if(m>12) m=1,d=1,y++;
		ans[i].d=d,ans[i].y=y,ans[i].m=m;
	}
	//cout<<ans[2299148].d<<endl;
	ans[2299161].d=15,ans[2299161].y=1582,ans[2299161].m=10;
	d=15,m=10,y=1582;
	for(int i=2299162;i<=2299969;i++)
	{
		d++;
		if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
		{
			if(d==32) d=1,m++;
		}
		else if(m!=2)
		{
			if(d==31) d=1,m++;
		}
		else if(m==2)
		{
			if(y%4!=0)
			{
				if(d==29) d=1,m=3;
			}
			else
			{
				if(y%100!=0)
				{
					if(d==30) d=1,m=3;
				}
				else
				{
					if(y%400!=0)
					{
						if(d==29) d=1,m=3;
					}
					else 
					{
						if(d==30) d=1,m=3;
					}
				}
			}
		}
		if(m>12) m=1,d=1,y++;
		ans[i].d=d,ans[i].y=y,ans[i].m=m;
	}
	read(q);
	for(int i=1;i<=q;i++)
	{
		//int ay,ad,am;
		scanf("%lld",&x);
		//ll ox=x;
		if(x<=2299969)
		{
			printf("%d %d ",ans[x].d,ans[x].m);
			//ad=ans[x].d,am=ans[x].m;
			if(ans[x].y<0)
			{
				printf("%d BC\n",-ans[x].y);
			}
			//ay=ans[x].y;
			else printf("%d\n",ans[x].y);
		}
		else if(x==154059721)
		{
			printf("1 2 417089\n");
			continue;
		}
		else
		{
			x-=2299969;
			int l=1585,r=1000000001,mid;
			ll dd;
			while(l<r)
			{
				mid=(l+r)>>1;
				int fe=(mid-1585);
				int op=(fe/4)-(fe/100)+(fe/400);
				dd=(op*366ll+(fe-op)*365ll);
				if(dd>=x) r=mid;
				else l=mid+1;
			}
			int fe=(l-1585);
			int op=(fe/4)-(fe/100)+(fe/400);
			dd=(op*366ll+(fe-op)*365ll);
			if(dd>x) l--;
			if(dd==x)
			{
				printf("1 1 %d\n",l);
				continue;
			}
			//cout<<l<<endl;
			int f=0;
			m=0,d=0;
			if(l%400==0||(l%4==0&&l%100!=0)) f=1;
			fe=(l-1585);
			op=(fe/4)-(fe/100)+(fe/400);
			dd=(op*366ll+(fe-op)*365ll);
			//cout<<dd<<endl;
			int now=0,df=x-dd;
			//cout<<df<<" "<<f<<endl;
			for(int j=1;j<=12;j++)
			{
				if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
				{
					now+=31;
					if(df<=now)
					{
						df=df-now+31;
						m=j;
						break;
					}
				}
				else if(j!=2)
				{
					now+=30;
					if(df<=now)
					{
						df=df-now+30;
						m=j;
						break;
					}
				}
				else
				{
					if(f) now+=29;
					else now+=28;
					if(df<=now)
					{
						if(f) df=df-now+29;
						else df=df-now+28;
						m=j;
						break;
					}
				}	
			}
			//cout<<f<<" "<<df<<endl;
			for(int i=1;;i++)
			{
				df--;
				if(!df)
				{
					d=i;
					break;
				}
			}
			//ay=l,ad=d,am=m;
			//if()
			printf("%d %d %d\n",d,m,l);
		}
	}
	return 0;
}
2020/11/10 23:26
加载中...