Cod sursa(job #1520675)

Utilizator RazvanR104Razvan-Andrei Ciocoiu RazvanR104 Data 9 noiembrie 2015 10:47:39
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

typedef int64_t i64;

const int NMAX = 100010;

int N;
i64 A[NMAX];
i64 res[NMAX], pos[NMAX];

void Solve(int left, int right) {
    if (left > right)
        return;

    int mid = (left + right) / 2;
    for (int i = pos[left - 1]; i <= min(pos[right + 1], i64(mid)); ++i) {
        if (res[mid] < (N - mid + 1) * A[mid] + (mid - i) * A[i]) {
            res[mid] = (N - mid + 1) * A[mid] + (mid - i) * A[i];
            pos[mid] = i;
        }
    }

    Solve(left, mid - 1);
    Solve(mid + 1, right);
}

int main() {
	ios_base::sync_with_stdio(false);
	#ifndef ONLINE_JUDGE
    freopen("avioane.in", "r", stdin);
    freopen("avioane.out", "w", stdout);
	freopen("debug.err", "w", stderr);
    #endif

    int i;

    cin >> N;
    for (i = 1; i <= N; ++i)
        cin >> A[i];
    sort(A + 1, A + N + 1);

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

    Solve(1, N);

    i64 answer = 0;
    for (i = 1; i <= N; ++i)
        answer = max(answer, res[i]);

    cout << answer << '\n';
	return 0;
}