QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#714736#9540. Double 11Trynitas (Ioan Popescu, Toma Ariciu)WA 2ms12156kbC++202.7kb2024-11-06 04:13:582024-11-06 04:13:59

Judging History

This is the latest submission verdict.

  • [2024-11-06 04:13:59]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 12156kb
  • [2024-11-06 04:13:58]
  • Submitted

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'