QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#724018#9540. Double 11ucup-team173WA 0ms3820kbC++202.7kb2024-11-08 08:15:572024-11-08 08:15:57

Judging History

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

  • [2024-11-08 08:15:57]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3820kb
  • [2024-11-08 08:15:57]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

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

ll 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]));
}
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 = 50;
    vector<db> dp(n + 1);
    vector<int> dpt(n + 1);
    while(timer--) {
        db mid = (l + r) * 0.5;
        static int q[maxn], lim[maxn];
        int h = 1, t = 1;
        q[1] = 0;
        for (int i = 1; i <= n; i++) {
            // cerr << i << " adso\n";
            while (h + 1 <= t) {
                if (dp[q[h]] + calc(q[h] + 1, i) >= dp[q[h + 1]] + calc(q[h + 1] + 1, i)) {
                    h++;
                } else
                    break;
            }
            // cerr << i << " upd " << q[h] << " cur mid is " << mid << " \n";
            dp[i] = dp[q[h]] + calc(q[h] + 1, i) - mid;
            dpt[i] = dpt[q[h]] + 1;
            int Ans;
            while (h + 1 <= t) {
                // cerr << "jjjj\n";
                int L = i + 1, R = n;
                Ans = n + 1;
                while (L <= R) {
                    // cerr << "wtf\n";
                    int MID = (L + R) >> 1;
                    if (dp[q[t]] + calc(q[t] + 1, MID) <= dp[i] + calc(i + 1, MID)) {
                        L = MID + 1;
                    } else {
                        Ans = MID;
                        R = MID - 1;
                    }
                }
                if (Ans <= lim[t])
                    t--;
                else
                    break;
            }
            {
                int L = i + 1, R = n;
                Ans = n + 1;
                while (L <= R) {
                    // cerr << "wtf\n";
                    int MID = (L + R) >> 1;
                    if (dp[q[t]] + calc(q[t] + 1, MID) <= dp[i] + calc(i + 1, MID)) {
                        L = MID + 1;
                    } else {
                        Ans = MID;
                        R = MID - 1;
                    }
                }
            }
            ++t;
            lim[t] = Ans;
            q[t] = i;
        }
        if (dpt[n] < m)
            l = mid;
        else
            r = mid;
    }
    // cerr << dpt[n] << "\n
    cout << fixed << setprecision(20) << (long double)(dp[n] + 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: 0
Wrong Answer
time: 0ms
memory: 3820kb

input:

4 2
1 2 3 4

output:

6.19114710253059552514

result:

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