Cod sursa(job #1534229)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 23 noiembrie 2015 15:59:26
Problema Avioane Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <bits/stdc++.h>

#define INF (1 << 30)
#define LLINF (1LL << 62)
#define mod 666013

using namespace std;

typedef long long LL;

int n, i, j, ok;
LL sol, mx, rez;
int v[100005];

LL ternary(int st, int dr, int m)
{
    if(st > dr)
        return 0;

    if(st == dr)
    {
        return 1LL * v[st] * (m - st + 1);
    }
    if(st == dr - 1)
    {
        int mij1 = st;
        int mij2 = dr;
        return max(1LL * v[mij1] * (m - mij1 + 1), 1LL * v[mij2] * (m - mij2 + 1));
    }

    int mij1 = st + (dr - st) / 3;
    int mij2 = st + ( 2 * (dr - st) ) / 3;

    if( 1LL * v[mij1] * (m - mij1 + 1) > 1LL * v[mij2] * (m - mij2 + 1) )
        return max( ternary(st, mij2 - 1, m), 1LL * v[mij1] * (m - mij1 + 1) );
    else
        return max( ternary(mij1 + 1, dr, m), 1LL * v[mij2] * (m - mij2 + 1) );
}

LL ternary2(int st, int dr, int val)
{
    if(st > dr)
        return 0;

    if(st == dr)
    {
        return 1LL * (v[st] - val) * (n - st + 1);
    }
    if(st == dr - 1)
    {
        int mij1 = st;
        int mij2 = dr;
        return max(1LL * (v[mij1] - val) * (n - mij1 + 1), 1LL * (v[mij2] - val) * (n - mij2 + 1));
    }

    int mij1 = st + (dr - st) / 3;
    int mij2 = st + ( 2 * (dr - st) ) / 3;

    if( 1LL * (v[mij1] - val) * (n - mij1 + 1) > 1LL * (v[mij2] - val) * (n - mij2 + 1) )
        return max( ternary2(st, mij2 - 1, val), 1LL * (v[mij1] - val) * (n - mij1 + 1) );
    else
        return max( ternary2(mij1 + 1, dr, val), 1LL * (v[mij2] - val) * (n - mij2 + 1) );
}

class Reader
{
private:
    char buff[100805];
    int buffer, cnt;

public:
    Reader()
    {
        buffer = 1 << 15;
        cnt = buffer - 1;
    }

    char gChar()
    {
        if(++cnt == buffer)
        {
            cnt = 0;
            fread(buff, buffer, 1, stdin);
        }
        return buff[cnt];
    }

    int gInt()
    {
        int nr = 0;
        char ch = gChar();
        while(ch < '0' || '9' < ch)
            ch = gChar();
        while('0' <= ch && ch <= '9')
        {
            nr = nr * 10 + ch - '0';
            ch = gChar();
        }
        return nr;
    }
};
Reader rdr;

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

    n = rdr.gInt();
    for(i = 1; i <= n; i++)
        v[i] = rdr.gInt();
    sort(v + 1, v + n + 1);

    for(i = 2; i <= n; i++)
    {
        sol = 1LL * v[i] * (n - i + 1);
        sol += ternary(1, i - 1, i - 1);
        mx = max(mx, sol);
    }

    for(i = 1; i < n; i++)
    {
        sol = 1LL * v[i] * (n - i + 1);
        sol += ternary2(i + 1, n, v[i]);
        mx = max(sol, mx);
    }

    printf("%lld", mx);

    return 0;
}