QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#714299 | #9540. Double 11 | rageOfThunder# | WA | 7ms | 19916kb | C++23 | 2.0kb | 2024-11-05 22:30:40 | 2024-11-05 22:30:41 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'