QOJ.ac
QOJ
ID | Submission ID | Problem | Hacker | Owner | Result | Submit time | Judge time |
---|---|---|---|---|---|---|---|
#1578 | #892534 | #9540. Double 11 | 12345678hzx | 12345678hzx | Failed. | 2025-02-27 23:15:47 | 2025-02-27 23:15:47 |
Details
Extra Test:
Accepted
time: 0ms
memory: 8016kb
input:
4 2 1 2 3 3
output:
5.8989794855664
result:
ok found '5.898979486', expected '5.898979486', error '0.000000000'
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#892534 | #9540. Double 11 | 12345678hzx | AC ✓ | 841ms | 13796kb | C++20 | 1.3kb | 2025-02-10 10:47:18 | 2025-02-10 10:47:18 |
answer
#include<bits/stdc++.h>
using namespace std;
long long n,m,s[200005],sum[200005],head,tail,cnt[200005];
long double mid,f[200005];
pair<int,pair<int,int> >q[200005];
long double w(int i,int j) {
return f[j]+sqrt((i-j)*(sum[i]-sum[j]))+mid;
}
void solve() {
q[head=tail=1]={0,{1,n}};
for(int i=1;i<=n;i++) {
while(head<=tail&&q[head].second.second<i) head++;
f[i]=w(i,q[head].first),cnt[i]=cnt[q[head].first]+1;
while(head<=tail&&w(q[tail].second.first,i)<w(q[tail].second.first,q[tail].first)) tail--;
if(head>tail) {
q[++tail]={i,{i+1,n}};
continue;
}
if(w(q[tail].second.second,i)>w(q[tail].second.second,q[tail].first)) {
if(q[tail].second.second<n) tail++,q[tail]={i,{q[tail-1].second.second+1,n}};
continue;
}
int l=q[tail].second.first,r=q[tail].second.second,p;
while(l<=r) {
int Mid=(l+r)>>1;
if(w(Mid,i)<w(Mid,q[tail].first)) p=Mid,r=Mid-1;
else l=Mid+1;
}
q[tail].second.second=p-1,q[++tail]={i,{p,n}};
}
}
int main() {
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++) sum[i]=sum[i-1]+s[i];
long double l=0,r=1e12;
while(r-l>1e-11) {
mid=(l+r)/2,solve();
if(cnt[n]<m) r=mid;
else l=mid;
}
mid=l,solve();
printf("%.13Lf",f[n]-m*mid);
return 0;
}