Cod sursa(job #604434)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 22 iulie 2011 12:56:14
Problema Avioane Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include <cstdio>
#include <algorithm>

#define MAXN 100010
#define ll long long
using namespace std;

int N, A[MAXN], L[MAXN];
ll R[MAXN];
void rec(int lf, int rt) {
	
	if(lf > rt) return ;

	int mid = (lf + rt) / 2;
	R[mid] = -1;
	
	for(int i = L[lf - 1]; i <= L[rt + 1]; i++) {
		if (i > mid) break;
		ll x = 1LL * (mid - i + 1) * A[i];
		if(R[mid] < x) {
			L[mid] = i;
			R[mid] = x;
		}
	}
	rec(lf, mid - 1);
	rec(mid + 1, rt);
}	
int main() {

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

	scanf("%d\n", &N);

	for(int i = 1; i <= N; i++)
	       scanf("%d ", &A[i]);
	
	sort(A + 1, A + N + 1);
	
	L[N + 1] = N;
	rec(1, N);

	ll sol = 0;
	
	for(int i = 2; i <= N; i++) {
		ll x = (N - i + 1) * A[i] + R[i - 1];
		if(x > sol) {
			sol = x;
		}
	}
	printf("%lld\n", sol);
	return 0;
}