Cod sursa(job #1224285)

Utilizator ion824Ion Ureche ion824 Data 30 august 2014 13:41:07
Problema Avioane Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
const int NM = 100005;
const long long INF = 1111111111111111LL;
const long double eps = 1e-12;

long long a[NM], mx[NM];
long long mom[NM];
int ind[NM];
int N;

int main(){
	ifstream cin("avioane.in");
	ofstream cout("avioane.out");
	int i;
	
	cin >> N;
	for(i=1;i<=N;++i) cin >> a[i];
	sort(a+1,a+N+1);
	
	long long SMAX = 1LL * a[1] * N, Sum = 0;
	int last=1,vv;
	
	last=1;
	mx[1] = a[1];
	
	long long inter, now=1111111111111111LL;
	
	for(i=2;i<=N;++i)
	{	
		if(i == 8) 
		{
			i++;
			i--;
		}
	
		if(mom[i] > 0)
		{
			if(a[last] * (i - last + 1) <= mom[i])
			  last = ind[i];
			else
			{
				int j = ind[i];
				
				int l = i+1, r = N, mid;
			
				while(r - l > 1)
				{
					mid = (l+r) / 2;
					
					if(a[last] * (mid - last + 1) > a[j] * (mid - j+1)) l = mid;
					else r = mid;
				}
				if(a[last] * (l - last + 1) <= a[j] * (l - j+1)) r = l;
				
				if(a[last] * (r - last + 1) <= a[j] * (r - j+1)) 
				{
					if(mom[r] < a[j] * (r - j+1) || (mom[r] == a[j] * (r - j+1) && ind[r] < j))
					{
						mom[r] = a[j] * (r - j+1);
						ind[r] = j;	
					}	
				}
				
				
			}
		}
		
		if(a[i] >= a[last] * (i - last + 1))
		{
			last = i;
			now = INF;
		} 
		else
		if(a[last] != a[i] && i!=N)
		{
			/*
			long double  aux = ((long double) (a[last] * (1-last) + a[i] * (i-1)) / (long double) (a[i] - a[last]));	
			inter = (long long) ceil (aux - eps);
			if(now >= inter)
			{
				now = inter;
				vv = i;
			}
			*/
			
			int l = i+1, r = N, mid;
			
			while(r - l > 1)
			{
				mid = (l+r) / 2;
				
				if(a[last] * (mid - last + 1) > a[i] * (mid - i+1)) l = mid;
				else r = mid;
			}
			if(a[last] * (l - last + 1) <= a[i] * (l - i+1)) r = l;
			
			if(a[last] * (r - last + 1) <= a[i] * (r - i+1))
			{
				if(mom[r] < a[i] * (r - i+1) || (mom[r] == a[i] * (r - i+1) && ind[r] < i))
				{
					mom[r] = a[i] * (r - i+1);
					ind[r] = i;
				}
			}
			
		}
	
		mx[i] = a[last] * (i-last+1);	
	}
	int pzmax;
	for(i=2;i<=N;++i)
	{
		if(mx[i-1] + a[i]*(N-i+1) > SMAX)
		{
			SMAX = mx[i-1] + a[i]*(N-i+1);
			pzmax = i;
		}//SMAX = max(SMAX, mx[i-1] + a[i]*(N-i+1));
	}
	
	cout << SMAX << '\n';
	//cout << pzmax << '\n';
	//cout << a[37] * (114-37) + a[114] * (N-114+1) << '\n';
	
	return 0;
}