Pagini recente » Cod sursa (job #1926486) | Cod sursa (job #142099) | Cod sursa (job #3240532) | Cod sursa (job #2620196) | Cod sursa (job #2986716)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("avioane.in");
ofstream fout("avioane.out");
int n, v[100001];
typedef long long ll;
struct line
{
int a, b;
inline line(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
inline ll operator()(int k)
{
return 1LL * a * k + b;
}
};
line t[300001];
void update(line k, int i = 1, int l = 1, int r = n)
{
if (l == r)
{
if (k(l) > t[i](l))
t[i] = k;
return;
}
int m = (l + r) >> 1;
if (t[i].a > k.a)
swap(t[i], k);
if (t[i](m) < k(m))
{
swap(t[i], k);
update(k, i << 1, l, m);
}
else
update(k, (i << 1) + 1, m + 1, r);
}
long long query(int x, int i = 1, int l = 1, int r = n)
{
if (l == r)
return t[i](x);
int m = (l + r) >> 1;
if (x < m)
return max(t[i](x), query(x, (i << 1), l, m));
return max(t[i](x), query(x, (i << 1) + 1, m + 1, r));
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
sort(v + 1, v + n + 1);
long long maxi = 1LL * v[1] * n;
for (int i = 1; i <= n; i++)
{
update(line(v[i], -1LL * i * v[i]));
maxi = max(maxi, query(i) + 1LL * v[i] * (n - i + 1));
}
fout << maxi;
return 0;
}