Pagini recente » Borderou de evaluare (job #2243314) | Cod sursa (job #3223502) | Cod sursa (job #2726179) | Cod sursa (job #731150) | Cod sursa (job #2043319)
#include <cstdio>
#include <algorithm>
typedef long long i64;
const i64 INF = 2e14;
const int MAXN = 1e5;
int v[MAXN + 1], poz[MAXN + 1];
i64 d[MAXN + 1];
inline i64 gmax(i64 a, i64 b) {
return a > b ? a : b;
}
inline void solve(int st, int dr, int n) {
i64 sum;
if (st > dr) {
return;
}
int m = (st + dr) >> 1;
d[m] = -INF;
for (int i = poz[st - 1]; i <= poz[dr + 1]; ++i) {
sum = (i64)(m - i) * v[i] + (i64)(n - m + 1) * v[m];
if (d[m] < sum) {
d[m] = sum;
poz[m] = i;
}
}
solve(m + 1, dr, n);
solve(st, m - 1, n);
}
int main() {
int n;
i64 max;
FILE *f = fopen("avioane.in", "r");
fscanf(f, "%d", &n);
for (int i = 1; i <= n; ++i) {
fscanf(f, "%d", &v[i]);
}
fclose(f);
std::sort(v + 1, v + n + 1);
poz[0] = 1;
poz[n + 1] = n;
solve(1, n, n);
max = -INF;
for (int i = 1; i <= n; ++i) {
max = gmax(max, d[i]);
}
f = fopen("avioane.out", "w");
fprintf(f, "%lld\n", max);
fclose(f);
return 0;
}