Pagini recente » Cod sursa (job #197143) | Cod sursa (job #2654678) | Cod sursa (job #2698095) | Cod sursa (job #1339952) | Cod sursa (job #1994338)
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
ifstream cin("avioane.in");
ofstream cout("avioane.out");
const int MAXN = 100000;
const long long INF = 1000000000000000000LL;
int v[1 + MAXN + 1], where[1 + MAXN + 1];
long long best[1 + MAXN + 1];
void Solve(int left, int right) {
int middle = (left + right) / 2;
best[middle] = -INF;
for (int i = where[left - 1]; i <= where[right + 1]; i++)
if (best[middle] < 1LL * (middle - i + 1) * v[i] && i <= middle) {
best[middle] = 1LL * (middle - i + 1) * v[i];
where[middle] = i;
}
if (left < middle)
Solve(left, middle - 1);
if (middle < right)
Solve(middle + 1, right);
}
int main() {
int n;
cin >> n;
where[n + 1] = n;
for (int i = 1; i <= n; i++)
cin >> v[i];
sort(v + 1, v + n + 1);
Solve(1, n);
long long answer = 0;
for (int i = 0; i <= n; i++)
answer = max(answer, best[i] + 1LL * (n - i) * v[i + 1]);
cout << answer << "\n";
return 0;
}