Pagini recente » Cod sursa (job #1099937) | Cod sursa (job #1413282) | Cod sursa (job #1885315) | Cod sursa (job #650154) | Cod sursa (job #1536015)
#include <stdio.h>
#define MAXN 100000
#define EPS 0.000000001
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 char cmp(double x, double y){
if(x - y > EPS)
return 1;
if(y - x > EPS)
return -1;
return 0;
}
inline double inters(int p1, int p2){
int a = v[p1] * (p2 - p1);
return 1.0 * a / (v[p2] - v[p1]) + p1;
}
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 && 1LL * v[dq[st]] * (i - dq[st]) <= 1LL * v[dq[st + 1]] * (i - dq[st + 1]))
st++;
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]);
while(dr > st && 1LL * v[dq[dr - 1]] * (i - dq[dr - 1] + 1) <= v[i])
dr--;
while(dr - st >= 2 && cmp(inters(dq[dr - 2], dq[dr - 1]), inters(dq[dr - 1], i)) == 1)
dr--;
dq[dr] = i;
dr++;
}
FILE *out = fopen("avioane.out", "w");
fprintf(out, "%lld", max);
fclose(out);
return 0;
}