Pagini recente » Cod sursa (job #683801) | Cod sursa (job #558149) | Cod sursa (job #2892554) | Cod sursa (job #1861988) | Cod sursa (job #1988961)
#include <bits/stdc++.h>
#define maxN 100002
#define ll long long
using namespace std;
FILE *fin = freopen("avioane.in", "r", stdin);
FILE *fout = freopen("avioane.out", "w", stdout);
/* ----------------------- */
int n, v[maxN];
/* ----------------------- */
deque < int > d;
/* ----------------------- */
ll ans;
bool f(int i, int j1, int j2)
{
ll s1 = 1LL * v[j1] * (n - j1 + 1) - 1LL * v[j2] * (n - j2 + 1),
s2 = 1LL * v[i] * (n - i + 1) - 1LL * v[j1] * (n - j1 + 1);
return 1LL * s2 * (j2 - j1) >= 1LL * s1 * (j1 - i);
}
bool Event(int i, int j1, int j2)
{
ll s = 1LL * v[j2] * (n - j2 + 1) - 1LL * v[j1] * (n - j1 + 1) + 1LL * v[i] * (j2 - j1);
return s <= 0LL;
}
void dqFront(int i)
{
while (d.size() > 1)
{
int j2 = d.front();
d.pop_front();
int j1 = d.front();
if (Event(i, j1, j2))
continue;
d.push_front(j2);
break;
}
}
void dqBack(int i)
{
while (d.size() > 1)
{
int j1 = d.back();
d.pop_back();
int j2 = d.back();
if (f(i, j1, j2))
continue;
d.push_back(j1);
break;
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
scanf("%d", &v[i]);
sort(v + 1, v + n + 1);
ans = v[n];
d.push_back(n);
for (int i = n - 1; i >= 1; -- i)
{
dqBack(i);
d.push_back(i);
dqFront(i);
//printf("%d\n", d.front());
ans = max(ans, 1LL * v[i] * (d.front() - i) + 1LL * v[d.front()] * (n - d.front() + 1));
}
printf("%lld\n", ans);
return 0;
}