Pagini recente » Cod sursa (job #569508) | Cod sursa (job #3246838) | Cod sursa (job #273618) | Cod sursa (job #1726025) | Cod sursa (job #1450232)
#include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax = 100010;
int n , i;
int start[Nmax] , a[Nmax];
long long ans;
long long dp[Nmax];
void divide(int left , int right)
{
if (left >= right)
return;
int mid = (left + right) >> 1;
for (int i = start[left]; i <= mid && i <= start[right]; ++i)
if (1LL * (mid - i) * a[i] + 1LL * (n - mid + 1) * a[mid] > dp[mid])
dp[mid] = 1LL * (mid - i) * a[i] + 1LL * (n - mid + 1) * a[mid],
start[mid] = i;
divide(left , mid);
divide(mid + 1 , right);
}
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);
/// start[i] = [(start[i] ... i - 1) - economy] [(i ... n) - business]
start[1] = 1; start[n] = n;
divide(1 , n);
for (i = 1; i <= n; ++i)
ans = max(ans , dp[i]);
printf("%lld\n", ans);
return 0;
}