QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#714299#9540. Double 11rageOfThunder#WA 7ms19916kbC++232.0kb2024-11-05 22:30:402024-11-05 22:30:41

Judging History

你现在查看的是最新测评结果

  • [2024-11-05 22:30:41]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:19916kb
  • [2024-11-05 22:30:40]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
long long a,b,c,T,cn,ls[1000001],inf=1e9,an,g[1000001],d[1000001],q,w,sm[1000001],sm1[1000001],fa[21][200001],sm2[1000001],sm3[1000001];
long long sm4[1000001],pr[1000001],lg[1000001],de[1000001],v[1000001];
char s[1000001];
long double dp[1000001];
struct p{long long q,w;}l[1000001];
vector<int> qu[1000001];
long double eps=1e-12;
long double get(long double qq)
{
	long double x=sqrt(qq);
	while (true) {
    long double nx = (x + qq / x) / 2;
    if (abs(x - nx) < eps) break;
    x = nx;
  }
  return x;
}
long long st[1000001];
long double get(long long qq,long long ww)
{
	return dp[qq]+get((sm[ww]-sm[qq])*(ww-qq));
}
bool cmp(int qq,int ww){return qq<ww;}
long long ch(long double qq)
{
	long long lss=0;
	dp[0]=0;g[0]=0;
	cn=0;
//	st[++cn]=0;
	long long L=1;
	for(int i=1;i<=a;i++)
	{
		dp[i]=1e18;
		long long ll=0,rr=i-1,ann=i-1;
		while(ll<=rr)
		{
			long long mid=((ll+rr)>>1);
			if(mid==i-1||get(mid+1,i)-get(mid,i)>0) rr=mid-1,ann=mid;
			else ll=mid+1;
		}
//		for(int j=1;j<i;j++) cout<<get(j,i)-get(j-1,i)<<" ";cout<<"\n";
//		while(cn>1&&get(st[cn-1],i)<=get(st[cn],i)) --cn;
//		for(int j=0;j<i;j++)
//		{
//			if(get(j,i)+qq<dp[i])
//			{
//				dp[i]=get(j,i)+qq;
//				g[i]=g[j]+1;
//			}
//		}
		dp[i]=dp[ann]+get((sm[i]-sm[ann])*(i-ann))+qq;
		g[i]=g[ann]+1;
//		cout<<i<<" "<<dp[i]<<" "<<st[cn]<<"\n";
//		st[++cn]=i;
	}
	return g[a];
}
int main()
{
	for(int i=1;i<=1000000;i++) lg[i]=lg[i-1]+((1<<lg[i-1])==i);
	for(int i=1;i<=1000000;i++) lg[i]--;
	T=1;
	scanf("%lld%lld",&a,&b);
	for(int i=1;i<=a;i++) scanf("%lld",&d[i]);
	sort(d+1,d+a+1,cmp);
	for(int i=1;i<=a;i++) sm[i]=sm[i-1]+d[i];
	long double ll=0,rr=1e12;
	long double ann=0;
	while(rr-ll>=eps)
	{
		long double mid=((ll+rr)/2.0000);
		if(ch(mid)<=b) rr=mid-eps,ann=mid;
		else ll=mid+eps;
	}
	long long hh=ch(ann);
//	cout<<dp[a]<<" "<<g[a]<<"\n";
	ann=dp[a]-b*ann;
	printf("%.10Lf",ann);
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 7ms
memory: 19916kb

input:

4 2
1 2 3 4

output:

6.1911471296

result:

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

Test #2:

score: 0
Accepted
time: 7ms
memory: 19860kb

input:

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

output:

22.5916253665

result:

ok found '22.591625367', expected '22.591625367', error '0.000000000'

Test #3:

score: 0
Accepted
time: 6ms
memory: 18432kb

input:

1 1
1

output:

1.0000000000

result:

ok found '1.000000000', expected '1.000000000', error '0.000000000'

Test #4:

score: 0
Accepted
time: 6ms
memory: 18904kb

input:

1 1
100000

output:

316.2277660168

result:

ok found '316.227766017', expected '316.227766017', error '0.000000000'

Test #5:

score: -100
Wrong Answer
time: 3ms
memory: 18216kb

input:

7 1
10 47 53 9 83 33 15

output:

39.0260217217

result:

wrong answer 1st numbers differ - expected: '41.8330013', found: '39.0260217', error = '0.0670996'