QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#750672 | #9540. Double 11 | PlentyOfPenalty# | WA | 2ms | 10172kb | C++20 | 2.4kb | 2024-11-15 15:26:21 | 2024-11-15 15:26:22 |
Judging History
answer
#include <bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) begin(x), end(x)
#ifdef memset0
#define log(...) fprintf(stderr, __VA_ARGS__)
#else
#define endl '\n'
#define log(...) ((void)(0))
#endif
using namespace std;
using ll = long long;
using lf = long double;
using ull = unsigned long long;
using lll = __int128;
using pv = pair<lf, int>;
const int N = 400011;
int q[N], p[N];
ll a[N], sum[N];
pv f[N];
pv operator+(pv a, pv b) { return pv(a.first + b.first, a.second + b.second); }
pv calc(int l, int r, lf w) { return pv(w + sqrt(lf(r - l + 1) * (sum[r] - sum[l - 1])), 1); }
int n;
pv solve(lf w) {
int head = 1, tail = 0;
f[0] = pv(0, 0);
for (int i = 1; i <= n; ++i) {
f[i] = calc(1, i, w);
while (head < tail && p[head + 1] <= i) head++;
if (head <= tail) {
if (f[q[head]] + calc(q[head] + 1, i, w) < f[i]) f[i] = f[q[head]] + calc(q[head] + 1, i, w);
while (head < tail && p[head + 1] <= i + 1) head++;
if (head <= tail) p[head] = i + 1;
}
//
int r = n;
while (head <= tail) {
if (f[q[tail]] + calc(q[tail] + 1, p[tail], w) > f[i] + calc(i + 1, p[tail], w)) r = p[tail] - 1, tail--;
else if (f[q[tail]] + calc(q[tail] + 1, r, w) <= f[i] + calc(i + 1, r, w)) {
if (r < n) q[++tail] = i, p[tail] = r + 1;
break;
} else {
int L = p[tail], R = r;
while (L < R) {
int M = (L + R) >> 1;
if (f[q[tail]] + calc(q[tail] + 1, M, w) <= f[i] + calc(i + 1, M, w)) L = M + 1;
else
R = M;
}
q[++tail] = i, p[tail] = L;
break;
}
}
if (head > tail) {
q[++tail] = i;
p[tail] = i + 1;
}
}
return f[n];
}
int main() {
#ifdef memset0
freopen("F.in", "r", stdin);
#endif
cin.tie(0)->sync_with_stdio(0);
int m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i];
lf l = -1e16, r = 1e16;
for (int k = 1; k <= 200; ++k) {
lf mid = l + (r - l) / 2;
pv now = solve(mid);
int c = now.second;
if (c == m) {
printf("%.12lf\n", double(now.first - c * mid));
return 0;
}
if (c < m) r = mid;
else
l = mid;
}
pv now = solve(l);
printf("%.12lf\n", double(now.first - now.second * l));
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 8004kb
input:
4 2 1 2 3 4
output:
6.191147129557
result:
ok found '6.191147130', expected '6.191147130', error '0.000000000'
Test #2:
score: 0
Accepted
time: 2ms
memory: 9984kb
input:
10 3 1 2 3 4 5 6 7 8 9 10
output:
22.591625366514
result:
ok found '22.591625367', expected '22.591625367', error '0.000000000'
Test #3:
score: 0
Accepted
time: 1ms
memory: 10112kb
input:
1 1 1
output:
1.000000000000
result:
ok found '1.000000000', expected '1.000000000', error '0.000000000'
Test #4:
score: 0
Accepted
time: 0ms
memory: 10060kb
input:
1 1 100000
output:
316.227766016838
result:
ok found '316.227766017', expected '316.227766017', error '0.000000000'
Test #5:
score: -100
Wrong Answer
time: 0ms
memory: 10172kb
input:
7 1 10 47 53 9 83 33 15
output:
41.833007812500
result:
wrong answer 1st numbers differ - expected: '41.8330013', found: '41.8330078', error = '0.0000002'