QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#724070#9540. Double 11ucup-team173WA 0ms3892kbC++202.3kb2024-11-08 09:16:072024-11-08 09:16:07

Judging History

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

  • [2024-11-08 09:16:07]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3892kb
  • [2024-11-08 09:16:07]
  • 提交

answer

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

// using ll = long long;
using db = long 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;
            }
            assert(rr + 1 == ll);
            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 + m * 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: 100
Accepted
time: 0ms
memory: 3892kb

input:

4 2
1 2 3 4

output:

6.19114712955715607761

result:

ok found '6.191147130', expected '6.191147130', error '0.000000000'

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3812kb

input:

10 3
1 2 3 4 5 6 7 8 9 10

output:

22.52320246740135602920

result:

wrong answer 1st numbers differ - expected: '22.5916254', found: '22.5232025', error = '0.0030287'