Pagini recente » Cod sursa (job #1313575) | Cod sursa (job #1441900) | Cod sursa (job #710891) | Cod sursa (job #1171358) | Cod sursa (job #940020)
Cod sursa(job #940020)
#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;
}