马蜂良好有注释代码TLE 40pts求助QAQ
查看原帖
马蜂良好有注释代码TLE 40pts求助QAQ
510555
ImposterAnYu楼主2023/10/9 13:15
#include<bits/stdc++.h>
#define N 12
#define int1 int
using namespace std;
int1 q,t,day,month,year,i,LeaF;
int1 pn[N + 5] = {0,31,28,31,30,31,30,31,31,30,31,30,31},p = 365,rn[N + 5] = {0,31,29,31,30,31,30,31,31,30,31,30,31},r = 366,sumg = 97 * 366 + 303 * 365,sumr = 100 * 366 + 300 * 365;
int1 read(){
	int1 x = 0,f = 1;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-'){
			f = -1;
		}
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
void print(int1 x){
	if(x < 0){
		putchar('-');
		print(-x);
		return ;
	}
	if(x >= 10){
		print(x / 10);
	}
	putchar(x % 10 ^ 48);
	return ;
}
void ps(int1 x){
	print(x),putchar(' ');
	return ;
}
void pe(int1 x){
	print(x),putchar('\n');
	return ;
}
void solve(){
	t = read();
	if(t > LeaF){//在公历颁布以后。
		t -= LeaF;
		day = 15,month = 10,year = 1582;
		year += t / sumg * 400;//400年循环
		t %= sumg;
		while(1){//年++
			if((!((year + 1) & 3) && (year + 1) % 100) || !((year + 1) % 400)){
				if(t < r){
					break;
				}
				t -= r,year++;
			}else{
				if(t < p){
					break;
				}
				t -= p,year++;
			}
		}
		while(t--){//日++
			day++;
			if((!(year & 3) && year % 100) || !(year % 400)){
				if(day > rn[month]){
					month++,day = 1;
					if(month > 12){
						year++,month = 1;
					}
				}
			}else{
				if(day > pn[month]){
					month++,day = 1;
					if(month > 12){
						year++,month = 1;
					}
				}
			}
		}
	}else if(t == LeaF){
		printf("4 10 1582\n");
		return ;
	}else{
		day = 1,month = 1,year = -4713;
		for(i = 1; i <= 11; i++){//400年循环
			if(t > sumr){
				t -= sumr;
				year += 400;
			}else{
				break;
			}
		}
		int1 sum = 79 * 366 + 234 * 365;
		if(t > sum && year == -313){//公元1年及以后
			t -= sum;
			year = 1;
			while(1){//年++
				if(!(year & 3)){
					if(t < r){
						break;
					}
					t -= r,year++;
				}else{
					if(t > p){
						break;
					}
					t -= p,year++;
				}
			}
			while(t--){//日++
				day++;
				if(!(year & 3)){
					if(day > rn[month]){
						month++,day = 1;
						if(month > 12){
							year++,month = 1;
						}
					}
				}else{
					if(day > pn[month]){
						month++,day = 1;
						if(month > 12){
							year++,month = 1;
						}
					}
				}
			}
		}else{//公元前
        /*
			while(1){//年++
				if(!((year + 10001) & 3)){
					if(t < r){
						break;
					}
					t -= r,year++;
				}else{
					if(t > p){
						break;
					}
					t -= p,year++;
				}
			}
        */
			while(t--){//日++
				day++;
				if(!((year + 10001) & 3)){
					if(day > rn[month]){
						month++,day = 1;
						if(month > 12){
							year++,month = 1;
						}
					}
				}else{
					if(day > pn[month]){
						month++,day = 1;
						if(month > 12){
							year++,month = 1;
						}
					}
				}
			}
		}
	}
	if(year < 0){
		ps(day),ps(month),ps(-year);
		printf("BC\n");
	}else{
		ps(day),ps(month),pe(year);
	}
	return ;
}
int main(){
//	freopen("julian.in","r",stdin);
//	freopen("julian.out","w",stdout);
	day = 1,month = 1,year = -4713;
	for(LeaF = 1; !(year == 1582 && month == 10 && day == 4); LeaF++){//算是在公历颁布之前还是之后。(不要在意这个变量名
		day++;
		if(year < 0){//<0表示在公元前。
			if(!((year + 10001) & 3)){
				if(day > rn[month]){
					month++,day = 1;
					if(month > 12){
						year++,month = 1;
					}
				}
			}else{
				if(day > pn[month]){
					month++,day = 1;
					if(month > 12){
						year++,month = 1;
					}
				}
			}
		}else if(year > 0){
			if(!(year & 3)){
				if(day > rn[month]){
					month++,day = 1;
					if(month > 12){
						year++,month = 1;
					}
				}
			}else{
				if(day > pn[month]){
					month++,day = 1;
					if(month > 12){
						year++,month = 1;
					}
				}
			}
		}
		if(!year){//公元0年不存在。
			year++,month = 1,day = 1;
		}
	}
//	pe(LeaF);
	q = read();
	while(q--){
		solve();
	}
	return 0;
}
2023/10/9 13:15
加载中...