QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#725293 | #9540. Double 11 | zhoukangyang# | WA | 19ms | 15440kb | C++14 | 2.0kb | 2024-11-08 17:00:42 | 2024-11-08 17:00:42 |
Judging History
answer
#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define sz(a) ((int) (a).size())
#define ll long long
#define vi vectoe<int>
#define pb emplace_back
#define me(a, x) memset(a, x, sizeof(a))
// #define double long double
using namespace std;
const int N = 1 << 19, mod = 1e8 + 7;
int n, m;
int a[N];
pair<double,int> dp[N];
ll pre[N];
double tmp;
pair<double,int>calc(int l, int r) {
return make_pair(dp[l].first + sqrt((pre[r] - pre[l]) * (r - l)) + tmp, dp[l].second + 1);
}
int getwz(int x, int y) {
int l = 1, r = n, ans = n + 1;
while(l <= r) {
int mid = (l + r) >> 1;
if(calc(x, mid) >= calc(y, mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
return ans;
}
double sval(int l, int r) {
return sqrt((pre[r] - pre[l]) * (r - l));
}
int head, tail, q[N], las[N];
pair<double,int>check(double v) {
tmp = v;
L(i, 1, n) dp[i] = make_pair(1e18, 0);
dp[0] = make_pair(0, 0);
L(i, 1, n) {
pre[i] = pre[i - 1] + a[i];
}
head = tail = 1, q[tail] = 0, las[tail] = n + 1; // [las[i - 1], las[i])
// L(i, 0, n) {
// L(j, i + 1, n) {
// dp[j] = min(dp[j], calc(i, j));
// }
// }
L(i, 1, n) {
while(head < tail && las[head] <= i) ++head;
dp[i] = calc(q[head], i);
while(head < tail && getwz(q[tail], i) <= las[tail - 1]) --tail;
las[tail] = getwz(q[tail], i), q[++tail] = i, las[tail] = n + 1;
}
me(las, 0);
me(pre, 0);
me(q, 0);
return dp[n];
}
int main() {
ios :: sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
L(i, 1, n) {
cin >> a[i];
}
sort(a + 1, a + n + 1);
double l = 0, r = 1e9, ans = 0;
R(t, 60, 0) {
double mid = (l + r) / 2;
auto val = check(mid);
ans = max(ans, val.first - mid * m);
// cout << mid << " : " << val.first << ' ' << val.second << ' ' << mid * m << endl;
if(val.second < m) {
r = mid;
} else {
l = mid;
}
}
cout.precision(12); cout << fixed;
cout << ans << '\n';
// cout << sqrt(3 * 2) + sqrt(7. * 2) << endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 19ms
memory: 14784kb
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: 15ms
memory: 15168kb
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: 19ms
memory: 15440kb
input:
1 1 1
output:
1.000000000000
result:
ok found '1.000000000', expected '1.000000000', error '0.000000000'
Test #4:
score: 0
Accepted
time: 15ms
memory: 15368kb
input:
1 1 100000
output:
316.227766036987
result:
ok found '316.227766037', expected '316.227766017', error '0.000000000'
Test #5:
score: -100
Wrong Answer
time: 15ms
memory: 15240kb
input:
7 1 10 47 53 9 83 33 15
output:
41.833001375198
result:
wrong answer 1st numbers differ - expected: '41.8330013', found: '41.8330014', error = '0.0000000'