Cod sursa(job #3179810)

Utilizator puica2018Puica Andrei puica2018 Data 4 decembrie 2023 11:42:50
Problema Avioane Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("avioane.in");
ofstream fout("avioane.out");

/**
i<j

a[j]*(n-j+1) + a[i]*(j-i)

a[j]*n-a[j]*j+a[j] + a[i]*j-a[i]*i
*/

int n;
int a[100005];

struct F
{
    long long u,v;
    int l,r;

    long long eval(int x)
    {
        return u*x+v;
    }
};

/**
u1*x+v1 = u2*x+v2
x*(u1-u2) = v2-v1
x=(v2-v1)/(u1-u2)
*/

int Intersection(F f1,F f2)
{
    return (f2.v-f1.v)/(f1.u-f2.u);
}

int i1=1,i2;
F h[100005];

int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>a[i];

    sort(a+1,a+n+1);

    long long ans=0;
    for(int i=1; i<=n; i++)
    {
        if(i==1 || a[i]>a[i-1])
        {
            F f;
            f.u=a[i];
            f.v=-1LL*a[i]*i;
            f.l=f.r=0;

            while(i2>=i1 && h[i2].l>=Intersection(f,h[i2]))
                i2--;

            if(i2>=i1)
            {
                h[i2].r=Intersection(f,h[i2]);

                f.l=h[i2].r;
                f.r=n;

                h[++i2]=f;
            }
            else
            {
                f.l=1;
                f.r=n;

                h[++i2]=f;
            }
        }

        while(i1<=i2 && h[i1].r<i)
            i1++;

        if(i>=2)
            ans=max(ans,1LL*a[i]*n-1LL*a[i]*i+a[i]+h[i1].eval(i));
    }

    fout<<ans<<"\n";
    return 0;
}