Cod sursa(job #1227832)

Utilizator thewildnathNathan Wildenberg thewildnath Data 11 septembrie 2014 21:46:33
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define NMAX 100002
#define INF 4611686018427387904ll

int n, v[NMAX], poz[NMAX];
long long din[NMAX];

void divide(int st, int dr)
{
    if(st>dr)
        return;

    int i=(dr+st)>>1;

    din[i]=-INF;
    for(int j=poz[st-1]; j<=poz[dr+1]; ++j)
    {
        long long sum=(long long)(i-j)*v[j] + (long long)(n-i+1)*v[i];

        if(sum>din[i])
        {
            din[i]=sum;

            poz[i]=j;
        }
    }

    divide(st, i-1);
    divide(i+1, dr);
}

int main()
{
    freopen("avioane.in", "r", stdin);
    freopen("avioane.out", "w", stdout);

    long long maxi=0;

    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
        scanf("%d", &v[i]);

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

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

    divide(1, n);

    for(int i=1; i<=n; ++i)
    {
        if(din[i]>maxi)
            maxi=din[i];
    }

    printf("%lld\n", maxi);

    return 0;
}