Cod sursa(job #2340304)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 10 februarie 2019 11:19:30
Problema Avioane Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("avioane.in");
ofstream g("avioane.out");

const int NMAX=1e5+5;

int A[NMAX], N;

int poz[NMAX];

long long ans[NMAX];

long long sol=0;

inline void Read ()
{
    f.tie(NULL);

    f>>N;

    for(int i=1; i<=N; ++i)
        f>>A[i];

    sort(A+1, A+N+1);

    return;
}

inline void Solve (int Left, int Right)
{
    int Mid=(Left+Right)/2;

    for(int i=poz[Left-1]; i<=poz[Right+1] && i <= Mid; ++i)
        if((Mid-i+1)*(1LL*A[i]) > ans[Mid])
        {
            ans[Mid]=(Mid-i+1)*(1LL*A[i]);

            poz[Mid]=i;
        }

    if(Mid >= Left+1)
        Solve(Left, Mid-1);

    if(Right >= Mid+1)
        Solve(Mid+1, Right);
}

int main()
{
    Read();

    poz[0]=1;
    poz[N+1]=N;

    Solve(1, N);

    for(int i=2; i<=N; ++i)
        sol=max(sol, (N-i+1)*(1LL*A[i])+ans[i-1]);

    g<<sol<<'\n';

    exit(0);

    return 0;
}