Cod sursa(job #864413)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 24 ianuarie 2013 22:28:23
Problema Avioane Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#include<algorithm>

#define maxn 100005

using namespace std;

FILE*f=fopen("avioane.in","r");
FILE*g=fopen("avioane.out","w");

const long long inf = 1LL<<62;
int n;
int A[maxn],st[maxn],left[maxn];

inline int get_inters ( int a , int b ){
	
	int left = b,middle,right = n;
	while ( left <= right ){
		middle = (left+right)>>1;
		
		if ( 1LL*A[a]*(middle-a+1) >= 1LL*A[b]*(middle-b+1) ){
			right = middle-1;
		}
		else{
			left = middle+1;
		}
	}
	
	return left;
}

int main () {
	
	fscanf(f,"%d",&n);
	for ( int i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d",&A[i]);
	}
	
	sort(A+1,A+n+1);
	
	for ( int i = 1 ; i <= n ; ++i ){
		
		int k = 1;
		while ( st[0] && (k = get_inters(i,st[st[0]])) <= left[st[0]] ){
			st[st[0]--] = 0;
		}
		st[++st[0]] = i;
		left[st[0]] = k;
	}
	
	int p = 0; long long sol = -inf;
	for ( int i = 1 ; i <= n+1 ; ++i ){
		
		while ( p < st[0] && left[p+1] <= i ){
			++p;
		}
		sol = max(sol,1LL*A[st[p]]*(i-st[p]) + A[i]*(n-i+1));
	}
	
	fprintf(g,"%lld",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}