Cod sursa(job #1181126)

Utilizator danalex97Dan H Alexandru danalex97 Data 1 mai 2014 21:19:14
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream F("avioane.in");
ofstream G("avioane.out");

const int N = 100010;
const long long infi = 1LL<<45;

int n,v[N],deque[N];
long long ans;

long long better(const int i, const int j)
{
    if ( v[i] == v[j] ) return infi;

    int l = j - i + 1;
    if ( 1LL*v[i]*l < 1LL*v[j] ) return -infi;

    long long dif1 = 1LL*v[i]*l-v[j];
    long long dif2 = v[j]-v[i];

    return (dif1 / dif2) + ( ( max(dif1,-dif1) % dif2 ) ? 1LL : 0LL );
}

long long cost(int i,int j)
{
    return 1LL*v[j]*(n-j+1) + 1LL*v[i]*(j-i);
}

int main()
{
    F>>n;
    int now = 0;
    for (int i=1,x;i<=n;++i)
    {
        F>>x;
        if ( x > 0 ) v[++now] = x;
    }
    n = now;

    sort(v+1,v+n+1);
    ans = max(ans,cost(1,2));

    int st = 1 ,dr = 1;
    deque[st] = 1;

    for (int i=3;i<=n;++i)
    {
        ans = max(ans,cost(deque[st],i));
        while ( ( st < dr && 1LL*deque[st+1] + better(deque[st],deque[st+1]) <= 1LL*i - 1LL ) ) ++st , ans = max(ans,cost(deque[st],i));

        if ( v[i-1] == v[deque[dr]] ) continue;

        while ( dr > st && 1LL*(i-1) + better(deque[dr],i-1) <= deque[dr] + better(deque[dr-1],deque[dr]) ) --dr;
        deque[++dr] = i-1;

        if ( st <= dr ) ans = max(ans,cost(deque[st],i));
    }

    G<<ans<<'\n';
}