Pagini recente » Cod sursa (job #2890499) | Cod sursa (job #2190582) | Cod sursa (job #1496794) | Cod sursa (job #1027627) | Cod sursa (job #1534322)
#include <bits/stdc++.h>
#define INF (1 << 30)
#define LLINF (1LL << 62)
#define mod 666013
using namespace std;
typedef long long LL;
struct dreapta
{
LL vit, start, lft;
} drp, dr[100005], r[100005];
LL n, i, k, pct;
LL sol, mx;
LL v[100005];
stack <dreapta> stv;
LL intersect(dreapta a, dreapta b)
{
if(a.vit == b.vit)
return -1;
LL rez = (b.start - a.start) / (a.vit - b.vit);
if( rez * (a.vit - b.vit) < (b.start - a.start) )
rez++;
return rez;
}
bool cmp(dreapta a, dreapta b)
{
if(a.vit == b.vit)
return a.start < b.start;
return a.vit < b.vit;
}
int main()
{
freopen("avioane.in", "r", stdin);
freopen("avioane.out", "w", stdout);
scanf("%lld", &n);
for(i = 1; i <= n; i++)
scanf("%lld", &v[i]);
sort(v + 1, v + n + 1);
for(i = 1; i <= n; i++)
{
dr[i].vit = v[i];
dr[i].start = -v[i] * i;
}
sort(dr + 1, dr + n + 1, cmp);
for(i = 1; i <= n; i++)
{
while(!stv.empty())
{
pct = intersect(dr[i], stv.top());
if(pct <= stv.top().lft)
stv.pop();
else
break;
}
drp = dr[i];
if(stv.empty())
drp.lft = 0;
else
drp.lft = pct;
stv.push(drp);
}
while(!stv.empty())
{
r[++k] = stv.top();
stv.pop();
}
for(i = 2; i <= n; i++)
{
while(k > 1 && i >= r[k - 1].lft)
k--;
sol = 1LL * v[i] * (n - i + 1) + 1LL * r[k].start + 1LL * r[k].vit * i;
mx = max(sol, mx);
}
printf("%lld", mx);
return 0;
}