Cod sursa(job #940020)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 15 aprilie 2013 14:08:11
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAXN 100010
#define point pair<int, long long>
#define x first
#define y second

point Deque[MAXN];
int A[MAXN];
long long D[MAXN], Ans;
int Front, Back, N;
int i, j;

inline long long det(const point &a, const point &b, const point &c)
{
	return (b.y * a.x + c.y * b.x + a.y * c.x) - (a.y * b.x + b.y * c.x + c.y * a.x);
}

inline long long f(const point &a, const int &X)
{
	return (1LL * a.x * X + a.y);
}

int main()
{
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	
	scanf("%d", &N);
	for (i = 1; i <= N; ++i)
		scanf("%d", &A[i]);
	sort(A + 1, A + N + 1);
	
	Front = 1; Back = 0; Ans = 0LL;
	for (i = 0; i <= N; ++i){
		while (Front < Back && f(Deque[Front], i) < f(Deque[Front + 1], i))
			++Front;
		D[i] = 1LL * (N - i + 1) * A[i] + f(Deque[Front], i);
		Ans = max(Ans, D[i]);

		Deque[++Back] = make_pair(A[i], -1LL * A[i] * i);
		while (Front + 1 < Back && det(Deque[Back - 2], Deque[Back - 1], Deque[Back]) >= 0){
			swap(Deque[Back], Deque[Back - 1]);
			--Back;
		}
	}

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