Cod sursa(job #1181158)

Utilizator smaraldaSmaranda Dinu smaralda Data 1 mai 2014 23:07:09
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

const int NMAX = 1e5;

int n, ticket[NMAX + 5], deque[NMAX + 5];

long long calc (int economy, int business) {
    return (long long)ticket[economy] * (business - economy) + (long long)ticket[business] * (n - business + 1);
}

int calcBusiness (int i, int j) {
    if(ticket[i] == ticket[j])
        return NMAX + 1;
    return 1 + (ticket[j] * j - ticket[i] * i) / (ticket[j] - ticket[i]);
}

int main() {
    freopen("avioane.in", "r", stdin);
    freopen("avioane.out", "w", stdout);
    int i, left, right;
    long long res;

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

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

    res = (long long)ticket[1] * n;
    left = right = 1;
    deque[1] = 1;
    for(i = 2; i <= n; ++ i) {
        while(left < right && calcBusiness(deque[left], deque[left + 1]) <= i)
            ++ left;

        res = max(res, calc(deque[left], i));

        if(ticket[i] == ticket[deque[right]])
            continue;

        while(left < right && calcBusiness(deque[right], i) < calcBusiness(deque[right - 1], i))
            -- right;

        deque[++ right] = i;
    }

    printf("%lld\n", res);
    return 0;
}