Cod sursa(job #585751)

Utilizator FlorianFlorian Marcu Florian Data 30 aprilie 2011 11:37:56
Problema Avioane Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 1.28 kb
using namespace std;
#include<cstdio>
#include<algorithm>
#define DIM 8192
#define ll long long
char vec[DIM];
int pz;
const int MAX_N = 100007;
int A[MAX_N], N;
ll sol;
int best[MAX_N];
void cit(int &x)   
{   

	x=0;   
	while(vec[pz]<'0' || vec[pz]>'9')   
  
    if(++pz==DIM) fread(vec,1,DIM,stdin),pz=0;   
  
    while(vec[pz]>='0' && vec[pz]<='9')   
    {   
        x=x*10 + vec[pz]-'0';   
        if(++pz==DIM) fread(vec, 1, DIM, stdin),pz=0;   
    }
}
ll get( int j, int i )
{
	return 1LL * A[j] * (i - j );
}
int main()
{
	freopen("avioane.in","r",stdin); freopen("avioane.out","w",stdout);
	int i, j, k , avans;
	ll p;
	cit(N);
	for(i = 1; i <= N; ++i)
		cit( A[i] );
	sort( A + 1,  A + N + 1 );
	int b = 0;
	for(i = 1; i <= N; ++i )
	{	
		p = get(b, i) + A[i] * ( N - i + 1 );
		
		if( A[i] != A[i-1]  && sol < p ) 
			sol = p;
		avans = i - b;
		if( A[i] != A[b] ) k = ( A[b] * avans ) / ( A[i] - A[b] );
		if( i + k <= N )
		{
			if( !best[ i+k ] ) best[ i + k ] = i;
			else
			{
				int bs = best[i + k];
				if( 1LL*A[i] * (k + 1) >= 1LL* A[bs] * ( i + k - bs + 1 ) )
					best[ i + k ] = i;
			}
		}
		if( best[i] )
			if( get( best[i], 1 + i  ) >= get ( b, 1 + i ) ) b = best[i];
	}
	printf("%lld\n", sol );
	return 0;
}