QOJ.ac

QOJ

IDSubmission IDProblemHackerOwnerResultSubmit timeJudge time
#1578#892534#9540. Double 1112345678hzx12345678hzxFailed.2025-02-27 23:15:472025-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'

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#892534#9540. Double 1112345678hzxAC ✓841ms13796kbC++201.3kb2025-02-10 10:47:182025-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;
}