QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#724086#9540. Double 11ucup-team173WA 1ms3892kbC++202.3kb2024-11-08 09:25:252024-11-08 09:25:29

Judging History

你现在查看的是最新测评结果

  • [2024-11-08 09:25:29]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3892kb
  • [2024-11-08 09:25:25]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mpr make_pair

// using ll = long long;
using db = double;
const int maxn = 211111;
int n, m;

db s[maxn];
db calc(int l, int r) {
    assert(1 <= l && l <= r && r <= n);
    return sqrt(1. * (r - l + 1) * (s[r] - s[l - 1]));
}
pair<db, int> solve(db v) {
    static vector<db> dp(n + 1);
    static vector<int> dpt(n + 1);
    static deque<int> q, l, r;
    q.clear(), l.clear(), r.clear();
    auto calc = [&](int i, int j) {
        return dp[i - 1] + sqrt((s[j] - s[i - 1]) * (j - i + 1)) - v;
    };
    for (int i = 1; i <= n; i++) {
        if (q.size() && r.front() < i) {
            q.pop_front(), l.pop_front(), r.pop_front();
        }
        if (q.size()) l.front() = i;
        while (q.size() && calc(q.back(), l.back()) >= calc(i, l.back())) {
            q.pop_back(), l.pop_back(), r.pop_back();
        }
        if (q.size() == 0) {
            q.emplace_back(i);
            l.emplace_back(i);
            r.emplace_back(n);
        } else if (calc(q.back(), n) >= calc(i, n)) {
            int ll = l.back(), rr = n;
            while (ll <= rr) {
                int mid = (ll + rr) / 2;
                if (calc(i, mid) <= calc(q.back(), mid))
                    rr = mid - 1;
                else
                    ll = mid + 1;
            }
            r.back() = rr;
            q.emplace_back(i), l.emplace_back(ll), r.emplace_back(n);
        }
        dp[i] = calc(q.front(), i);
        dpt[i] = dpt[q.front() - 1] + 1;
    }
    return mpr(dp[n], dpt[n]);
}
void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
    }
    sort(s + 1, s + n + 1);
    for (int i = 1; i <= n; i++) {
        s[i] += s[i - 1];
    }
    db l = -1e8, r = 0;
    int timer = 70;
    while (timer--) {
        db mid = (l + r) * 0.5;
        auto res = solve(mid);
        if (res.se < m)
            l = mid;
        else
            r = mid;
    }
    auto res = solve(l);
    cout << fixed << setprecision(20) << (long double)(res.fi + res.se * l) << "\n";
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3892kb

input:

4 2
1 2 3 4

output:

6.32455532033675904557

result:

wrong answer 1st numbers differ - expected: '6.1911471', found: '6.3245553', error = '0.0215482'