QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#714736 | #9540. Double 11 | Trynitas (Ioan Popescu, Toma Ariciu) | WA | 2ms | 12156kb | C++20 | 2.7kb | 2024-11-06 04:13:58 | 2024-11-06 04:13:59 |
Judging History
answer
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
int v[200005];
//int opt[200005];
long long spar[200005];
int lz[1800005];
int mijloc[1800005];
int drr[1800005];
pair<long double,int> dp[200005];
long double calc(int i,int j)
{
if(i>=j)
{
return 1e10;
}
return dp[i].first+sqrt((spar[j]-spar[i])*(j-i));
}
void push(int node,int st,int dr)
{
if(lz[node]!=-1)
{
mijloc[node]=lz[node];
drr[node]=lz[node];
if(st!=dr)
{
lz[node*2]=lz[node];
lz[node*2+1]=lz[node];
drr[node*2]=lz[node];
drr[node*2+1]=lz[node];
mijloc[node*2]=lz[node];
mijloc[node*2+1]=lz[node];
}
}
lz[node]=-1;
}
void update(int node,int st,int dr,int from)
{
push(node,st,dr);
if(dr<st)
{
return;
}
int mij=(st+dr)/2;
if(st==dr)
{
if(calc(from,mij)<=calc(mijloc[node],mij))
{
lz[node]=from;
push(node,st,dr);
}
return;
}
if(calc(from,mij)<=calc(mijloc[node],mij))
{
lz[node*2+1]=from;
push(node*2+1,mij+1,dr);
update(node*2,st,mij,from);
}
else
{
update(node*2+1,mij+1,dr,from);
}
push(node*2,st,mij);
push(node*2+1,mij+1,dr);
drr[node]=drr[node*2+1];
mijloc[node]=drr[node*2];
}
int qr(int node,int st,int dr,int poz)
{
push(node,st,dr);
if(st==dr)
{
return mijloc[node];
}
int mij=(st+dr)/2;
if(poz<=mij)
{
return qr(node*2,st,mij,poz);
}
else
return qr(node*2+1,mij+1,dr,poz);
}
int n;
int check(long double plm)
{
long double valus;
int from;
lz[1]=0;
push(1,2,3);
for(int i=1; i<=n; i++)
{
from=qr(1,1,n,i);
dp[i].first=calc(from,i)+plm;
dp[i].second=dp[from].second+1;
update(1,1,n,i);
}
return dp[n].second;
}
int main()
{
int i,j,k,l,m,val;
long double st=-1e9,dr=0,mij;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m;
for(i=1; i<=n; i++)
{
cin>>v[i];
}
sort(v+1,v+n+1);
for(i=1; i<=n; i++)
{
spar[i]=spar[i-1]+v[i];
}
for(i=1; i<=60; i++)
{
mij=(st+dr)/2;
val=check(mij);
if(val==m)
{
break;
}
else if(val>m)
{
st=mij;
}
else
{
dr=mij;
}
}
cout<<fixed<<setprecision(9)<<dp[n].first-dp[n].second*mij;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 12156kb
input:
4 2 1 2 3 4
output:
6.146264370
result:
wrong answer 1st numbers differ - expected: '6.1911471', found: '6.1462644', error = '0.0072495'