话说这题80分好像是白给
查看原帖
话说这题80分好像是白给
249422
TinyMirror1楼主2020/11/13 21:00

不想正解,完全可以预处理一天一天往上加,前八个点最多 1e7 跑的下

#include <iostream>
#include <cstdio>
using namespace std;
const int maxr = 1e7 + 1;
int day[maxr], month[maxr], year[maxr];
int common[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int special[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool judge_year(int x) {
	if (x < 0) return (-x - 1) % 4 == 0;
	if (x <= 1582) return x % 4 == 0;
	if (x % 100 == 0) return x % 400 == 0;
	return x % 4 == 0;
}
int main() {
	day[0] = 1;
	month[0] = 1;
	year[0] = -4713;
	for (int r = 1; r < maxr; r++) {
		int y = year[r - 1];
		int m = month[r - 1];
		int d = day[r - 1] + 1;
		if (m == 12 && d == 32) {
			year[r] = y + 1 + (y == -1);
			month[r] = 1;
			day[r] = 1;
			continue;
		}
		if (y == 1582 && m == 10 && d == 5) {
			year[r] = 1582;
			month[r] = 10;
			day[r] = 15;
			continue;
		}
		if (judge_year(y)) {
			if (d == special[m] + 1) {
				year[r] = y;
				month[r] = m + 1;
				day[r] = 1;
				continue;
			} else {
				year[r] = y;
				month[r] = m;
				day[r] = d;
				continue;
			}
		} else {
			if (d == common[m] + 1) {
				year[r] = y;
				month[r] = m + 1;
				day[r] = 1;
				continue;
			} else {
				year[r] = y;
				month[r] = m;
				day[r] = d;
				continue;
			}
		}
	}
	int T, x; scanf("%d", &T);
	while (T--) {
		scanf("%d", &x);
		if (year[x] < 0) {
			printf("%d %d %d BC\n", day[x], month[x], -year[x]);
		} else {
			printf("%d %d %d\n", day[x], month[x], year[x]);
		}
	}
	return 0;
}
2020/11/13 21:00
加载中...