Pagini recente » Cod sursa (job #576009) | Cod sursa (job #2674480) | Cod sursa (job #3272574) | Cod sursa (job #171348) | Cod sursa (job #2986720)
#include <bits/stdc++.h>
using namespace std;
string fileName = "avioane";
ifstream fin(fileName + ".in");
ofstream fout(fileName + ".out");
int n, v[100001];
struct line
{
long long a, b;
inline line(long long a = 0, long long b = 0)
{
this->a = a;
this->b = b;
}
inline long long operator()(int k)
{
return 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 = 0;
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;
}