我没用二分,使的结构体排序,从小到大排序每次计算差的天数再累加,能不能在这个基础上改啊?
细节太多,代码量比较大,其实主要的结构并不多,就是特判太多了,调了两个半点
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
struct node {
long long val, num, y, m, d;
} a[100005];
long long n, p;
long long oy, om, od;
long long months[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool cmp(node a, node b) {
if (a.val == b.val) return a.num < b.num;
return a.val < b.val;
}
bool isrun(long long y) {
if (y > 1582) return ((!(y % 4) && y % 100) || !(y % 400));
return (!(y % 4));
}
void overten(long long y, long long m, long long d) {
if (d < 19) {
printf("%lld %lld %lld\n", d + 10, m, y);
} else if (d == 19) {
if (isrun(y) && m == 2) {
printf("%d %d %lld\n", 29, 2, y);
} else if (!isrun(y) && m == 2) {
printf("%d %d %lld\n", 1, 3, y);
} else {
printf("%d %lld %lld\n", 29, m, y);
}
} else if (d == 20) {
if (isrun(y) && m == 2) {
printf("%d %d %lld\n", 1, 3, y);
} else if (!isrun(y) && m == 2) {
printf("%d %d %lld\n", 2, 3, y);
} else {
printf("%lld %lld %lld\n", d + 10, m, y);
}
} else if (d == 21) {
if (isrun(y) && m == 2) {
printf("%d %d %lld\n", 2, 3, y);
} else if (!isrun(y) && m == 2) {
printf("%d %d %lld\n", 3, 3, y);
} else if (months[m] == 30) {
printf("%d %lld %lld\n", 1, m + 1, y);
} else {
printf("%lld %lld %lld\n", d + 10, m, y);
}
} else if (d >= 22) {
if (isrun(y) && m == 2) {
printf("%lld %d %lld\n", d - 19, 3, y);
} else if (!isrun(y) && m == 2) {
printf("%lld %d %lld\n", d - 18, 3, y);
} else if (m == 12) {
printf("%lld %d %lld\n", d - 21, 1, y + 1);
} else if (months[m] == 30) {
printf("%lld %lld %lld\n", d - 20, m + 1, y);
} else {
printf("%lld %lld %lld\n", d - 21, m + 1, y);
}
}
}
void func(long long x, long long y, long long m, long long d, long long num) {
x += d - 1;
long long nm = m;
long long ny = y;
long long nd = d;
while (x) {
if (ny < 0) {
if ((-ny - 1) % 4 == 0) {
months[2] = 29;
} else {
months[2] = 28;
}
} else {
if (isrun(ny)) {
months[2] = 29;
} else {
months[2] = 28;
}
}
if (x >= months[nm]) {
x -= months[nm];
nm++;
}
if (nm == 13) {
nm = 1;
ny++;
}
if (ny == 0) {
ny = 1;
}
if (x < months[nm]) {
nd = x + 1;
x = 0;
}
}
if (ny < 0) {
a[num].y = ny;
a[num].m = nm;
a[num].d = nd;
} else {
a[num].y = ny;
a[num].m = nm;
a[num].d = nd;
}
oy = ny;
om = nm;
od = nd;
}
int main() {
//freopen("julian.in", "r", stdin);
//freopen("julian.out", "w", stdout);
scanf("%llu", &n);
for (int i = 0; i < n; i++) {
long long t;
p++;
scanf("%llu", &t);
a[i].num = p;
a[i].val = t;
}
sort(a, a + n, cmp);
func(a[0].val, -4713, 1, 1, a[0].num);
for (int i = 1; i < n; i++) {
func(a[i].val - a[i - 1].val, oy, om, od, a[i].num);
}
for (int i = 1; i <= n; i++) {
if (a[i].y < 0) {
printf("%lld %lld %lld BC\n", a[i].d, a[i].m, -a[i].y);
} else {
if (a[i].y > 1582 || (a[i].y == 1582 && a[i].m >= 10 && a[i].d >= 5)) {
overten(a[i].y, a[i].m, a[i].d);
} else {
printf("%lld %lld %lld\n", a[i].d, a[i].m, a[i].y);
}
}
}
return 0;
}