90pts,最后一个点TLE
查看原帖
90pts,最后一个点TLE
275001
libmwlmgrimpl楼主2021/10/3 15:06

我没用二分,使的结构体排序,从小到大排序每次计算差的天数再累加,能不能在这个基础上改啊?

细节太多,代码量比较大,其实主要的结构并不多,就是特判太多了,调了两个半点

#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;
}

2021/10/3 15:06
加载中...