开了 long double 还是 40pts
查看原帖
开了 long double 还是 40pts
655192
Tibrella楼主2023/7/14 22:13

如题

求大佬帮忙看看哪块还会出现精度问题,错的那几个点和其他大佬精度问题出错的点一样,而且都是比标准答案少 1

f128 : long double i32 : int i64 : long long

f128 calc(i32 j, i32 i) {
    return a[j] - a[i] + sqrt(std::abs((f128)(i * 1.0 - j)));
}

i32 get_pos(const d& x, const i32& i) {
    i32 l = x.l, r = x.r, mid;
    while (l < r) {
        mid = (l + r) >> 1;
        if (calc(x.p, mid) <= calc(i, mid))
            r = mid;
        else
            l = mid + 1;
    }
    return r;
}

void solve() {
    q.push_back((d){ 1, n, 0 });
    for (i32 i = 1; i <= n; ++i) {
        if (q.size()) {
            if (q.front().r == i - 1)
                q.pop_front();
            else
                q.front().l = i;
        }
        p[i] = std::max(p[i], calc(q.front().p, i));

        i32 pos = q.back().l;

        while (q.size() && calc(q.back().p, q.front().l) <= calc(i, q.back().l)) {
            pos = q.back().l;
            q.pop_back();
        }

        if (q.empty())
            q.push_back((d){ i + 1, n, i });
        else {
            if (calc(q.back().p, q.back().r) >= calc(i, q.back().r)) {
                pos = q.back().r + 1;
            } else {
                pos = get_pos(q.back(), i);
            }
            if (pos <= n) {
                q.back().r = pos - 1;
                q.push_back((d){pos, n, i});
            }
        }
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n;
    for (i32 i = 1; i <= n; ++i)
        cin >> a[i];

    solve();
    q.clear();
    std::reverse(a + 1, a + n + 1);
    std::reverse(p + 1, p + n + 1);
    solve();
    std::reverse(p + 1, p + n + 1);
    for (i32 i = 1; i <= n; ++i)
        cout << (i32)std::ceil(p[i]) << '\n';

    return 0;
}
2023/7/14 22:13
加载中...