Pagini recente » Cod sursa (job #3309809) | Cod sursa (job #3333364) | Cod sursa (job #3350783) | Cod sursa (job #3242397) | Cod sursa (job #1536417)
#include <stdio.h>
#define MAXN 100000
#define EPS 0.0000001
#define INFLL 1000000000000000LL
int v[MAXN], dq[MAXN];
void qs(int st, int dr){
int i = st, j = dr, piv = v[(st + dr) / 2], aux;
while(i <= j){
while(v[i] < piv)
i++;
while(v[j] > piv)
j--;
if(i <= j){
aux = v[i]; v[i] = v[j]; v[j] = aux;
i++; j--;
}
}
if(st < j)
qs(st, j);
if(i < dr)
qs(i, dr);
}
inline long long inters(int p1, int p2){
if(v[p1] == v[p2])
return INFLL;
return (1LL * p2 * v[p2] - 1LL * p1 * v[p1]) / (v[p2] - v[p1]) + 1;
}
int main(){
FILE *in = fopen("avioane.in", "r");
int n, i;
fscanf(in, "%d", &n);
for(i = 0; i < n; i++)
fscanf(in, "%d", &v[i]);
fclose(in);
qs(0, n - 1);
int st = 0, dr = 1;
long long max = 1LL * v[0] * n;
dq[0] = 0;
for(i = 1; i < n; i++){
while(dr - st >= 2 && inters(dq[st], dq[st + 1]) < i)
st++;
while(dr - st >= 2 && inters(dq[dr - 2], dq[dr - 1]) >= inters(dq[dr - 2], i))
dr--;
dq[dr] = i;
dr++;
if(max < 1LL * v[i] * (n - i) + 1LL * v[dq[st]] * (i - dq[st]))
max = 1LL * v[i] * (n - i) + 1LL * v[dq[st]] * (i - dq[st]);
}
FILE *out = fopen("avioane.out", "w");
fprintf(out, "%lld", max);
fclose(out);
return 0;
}