QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#887672#9540. Double 11xjx2009WA 0ms5980kbC++142.2kb2025-02-07 19:04:022025-02-07 19:04:03

Judging History

This is the latest submission verdict.

  • [2025-02-07 19:04:03]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 5980kb
  • [2025-02-07 19:04:02]
  • Submitted

answer

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000010;
const long double eps=1e-8;

ll n,m;
long double a[N];
long double f[N],num[N],ans;

struct node{
	ll id,l,r;
}st[N];
ll top,ed;

long double w(ll l,ll r){
	return sqrtl(1.0*(r-l)*(a[r]-a[l]));
}

ll get_front(){
	ll id=st[ed].id;
	st[ed].l++;
	if(st[ed].l>st[ed].r) ed++;
	return id;
}

long double query(node x,ll y){
	return f[x.id]+w(x.id,y);
}

node nod(ll id,ll l,ll r){
	node x;x.id=id;x.l=l;x.r=r;
	return x;
}

void insert(node x){
//	printf("%lld %.6lf %.6lf\n",st[top].r,query(x,st[top].r),query(st[top],st[top].r));
	if(top>=ed&&query(x,st[top].r)>query(st[top],st[top].r)) return;
	
	x.r=n;
	while(top>=ed&&query(x,st[top].l)<query(st[top],st[top].l)) x.l=st[top].l,top--;
	
	if(top<ed||query(x,st[top].r)>query(st[top],st[top].r)) {st[++top]=x;return;}
	
	ll l=st[top].l,r=st[top].r;
	while(l<r){
		ll mid=(l+r)>>1;
		if(query(x,mid)<query(st[top],mid)) r=mid;
		else l=mid+1;
	}
	x.l=l;
	st[top].r=l-1;
	st[++top]=x;
}

ll solve(long double add){
//	cout<<"--------------"<<endl;
//	printf("%.10Lf\n",add);
	ed=1;top=0;
	st[++top]=nod(0,1,n);
	for(int i=1;i<=n;i++){
		ll id=get_front();
//		cout<<i<<" "<<id<<endl;
		f[i]=f[id]+w(id,i)+add;
		num[i]=num[id]+1;
		insert(nod(i,0,0));
	}
//	cout<<add<<" "<<num[n]<<" "<<f[n]<<" "<<f[n]-num[n]*add<<endl;
//	if(num[n]==m){
		ans=f[n]-num[n]*add;
//	}
	if(num[n]<=m) return 0;
	else return 1;
}

int main(){
	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++) a[i]+=a[i-1];
	double l=0,r=1e9;
	for(int i=1;i<=100;i++){
		double mid=(l+r)/2;
//		cout<<fixed<<setprecision(13)<<mid<<" "<<l<<" "<<r<<endl;
		if(solve(mid)) l=mid;
		else r=mid;
	}
	printf("%.12Lf",ans);
	return 0;
}
/*
5 1
100000000000 1000000000000 10000000000000 10000000001 1000000
2.4494897427831780981972840747059
71466 9482 98728 78471 22915 
2470 5999 53211 25994 3996 
11349 30511 56448 17277 78308
 18316 42069 38636 63127 26256 
 63985 57249 58305 64366 17839 
 28518 18980 95945 36316 6076 
 69530 96509 6940 6039 56048 
 41847 82118 41054 49670 95896 
 45891 74636 90736 75413 27251 
87730 68344 66202 71879 23152
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5980kb

input:

4 2
1 2 3 4

output:

6.191147129557

result:

ok found '6.191147130', expected '6.191147130', error '0.000000000'

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 5976kb

input:

10 3
1 2 3 4 5 6 7 8 9 10

output:

22.532385382358

result:

wrong answer 1st numbers differ - expected: '22.5916254', found: '22.5323854', error = '0.0026222'