40pts求助
查看原帖
40pts求助
150843
唐一文楼主2020/11/7 23:34

RT

考场上调了3h,过了大样例

#include<bits/stdc++.h>
#define ll long long
#define P 365
#define R 366
#define M 1721424
#define Year1582 577825
#define Lost 12
using namespace std;
namespace IO{
	#define iL (1<<20)
	char ibuf[iL],*iS=ibuf+iL,*iT=ibuf+iL;
	#define gc() ((iS==iT)?(iT=(iS=ibuf)+fread(ibuf,1,iL,stdin),(iS==iT)?EOF:*iS++):*iS++)
	template<class T>inline void read(T &x){
		register char c;register bool f;
		for(c=gc(),f=false;!isdigit(c);f|=c=='-',c=gc());
		for(x=0;isdigit(c);x=(x<<1)+(x<<3)+(c^48),c=gc());
		if(f)x=~x+1;
		return ;
	}
	char Out[iL],*iter=Out;
	#define flush() fwrite(Out,1,iter-Out,stdout),iter=Out
	template<class T>inline void write(T x){
		register T c[35],l;
		if(x<0)*iter++='-',x=~x+1;
		for(l=0;!l || x;c[l]=x%10,++l,x/=10);
		for(;l;--l,*iter++=c[l]+'0');
		flush();
		return ;
	}
}
using namespace IO;
//const ll day[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const ll dayP[15]={0,31,59,90,120,151,181,212,243,273,304,334,365};
const ll dayR[15]={0,31,60,91,121,152,182,213,244,274,305,335,366};
//const ll day1582[15]={0,31,28,31,30,31,30,31,31,30,21,30,31};
const ll dayT[15]={0,31,59,90,120,151,181,212,243,273,294,324,355};
inline bool CheckR(ll x){
	if(x<1582){
		if(!(x%4)){
			return true;
		}
		return false;
	}
	if(!(x%400) || (!(x%4) && x%100)){
		return true;
	}
	return false;
}
inline ll CalcBC(ll mid){
	if(mid>4713){
		return 0;
	}
	ll k=(4713ll-mid)/4ll+1ll;
	return (4714ll-mid-k)*P+k*R;
}
inline ll Calc(ll mid){
	if(mid<1582){
		ll k=mid/4ll;
		return (mid-k)*P+k*R;
	}
	ll k=mid/4ll-mid/100ll+mid/400ll+Lost;
	return (mid-k)*P+k*R;
}
int T;
ll n;
int main(){
	freopen("julian.in","r",stdin),freopen("julian.out","w",stdout);
	read(T);
	for(register int _=0;_<T;++_){
		read(n);
		if(n<=M+1){
			ll l=1ll,r=4714ll;
			while(l+1<r){
				ll mid=l+r>>1;
				if(CalcBC(mid)>n){
					l=mid;
				}
				else{
					r=mid;
				}
			}
			n-=CalcBC(l+1);
			if(!n){
				printf("1 1 "),write(l),printf(" BC\n");
			}
			else if((l-1)%4){
				for(register int i=1;i<13;++i){
					if(n+1<=dayP[i]){
						write(n-dayP[i-1]+1),putchar(' '),write(i),putchar(' '),write(l),printf(" BC\n");
						break;
					}
				}
			}
			else{
				for(register int i=1;i<13;++i){
					if(n+1<=dayR[i]){
						write(n-dayR[i-1]+1),putchar(' '),write(i),putchar(' '),write(l),printf(" BC\n");
						break;
					}
				}
			}
		}
		else{
			n-=M;
			if(n<=Year1582){
				ll l=0ll,r=1581ll;
				while(l+1<r){
					ll mid=l+r>>1;
					if(Calc(mid)<=n){
						l=mid;
					}
					else{
						r=mid;
					}
				}
				n-=Calc(l);
				if(!n){
					printf("1 1 "),write(r),putchar('\n');
				}
				else if(!CheckR(r)){
					for(register int i=1;i<13;++i){
						if(n+1<=dayP[i]){
							write(n-dayP[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
							break;
						}
					}
				}
				else{
					for(register int i=1;i<13;++i){
						if(n+1<=dayR[i]){
							write(n-dayR[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
							break;
						}
					}
				}
			}
			else{
				if(n<=Year1582+dayT[12]){
					for(register int i=1;i<13;++i){
						if(n<=Year1582+dayT[i]){
							if(i==2){
								int x=n-dayT[i-1];
								if(x<=4){
									write(x),printf(" 2 1582\n");
								}
								else{
									write(x+10),printf(" 2 1582\n");
								}
							}
							else{
								write(n-dayT[i-1]),putchar(' '),write(i),printf(" 1582\n");
							}
							break;
						}
					}
				}
				else{
					n=n+10;
					ll l=1583ll,r=100000001ll;
					while(l+1<r){
						ll mid=l+r>>1;
						if(Calc(mid)<=n){
							l=mid;
						}
						else{
							r=mid;
						}
					}
					n-=Calc(l);
					if(!n){
						printf("1 1 "),write(r),putchar('\n');
					}
					else if(!CheckR(r)){
						for(register int i=1;i<13;++i){
							if(n+1<=dayP[i]){
								write(n-dayP[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
								break;
							}
						}
					}
					else{
						for(register int i=1;i<13;++i){
							if(n+1<=dayR[i]){
								write(n-dayR[i-1]+1),putchar(' '),write(i),putchar(' '),write(r),putchar('\n');
								break;
							}
						}
					}
				}
			}
		}
	}
	return 0;
}
2020/11/7 23:34
加载中...