Cod sursa(job #727613)

Utilizator crushackPopescu Silviu crushack Data 28 martie 2012 09:44:18
Problema Avioane Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <algorithm>
#define NMax 100010
using namespace std;

const char IN[]="avioane.in",OUT[]="avioane.out";

struct point{
	double x;
	double y;
};

struct dreapta{
	int a,b;
} d[NMax];

int N,L,Rez;
int A[NMax];

point intersect(dreapta &A,dreapta &B){
	point ret={
		(B.b-A.b)/(double)(A.a-B.a),
		(A.b*B.a-B.b*A.a)/(double)(B.a-A.a)
	};
	return ret;
}

void add(int a,int b){
	
	dreapta x={a,b};
	
	while (L>1){
		
		point x1=intersect(x,d[L]);
		point x2=intersect(x,d[L-1]);
		
		if (x1.x<x2.x) --L;
		else break;
	}
	d[++L]=x;
}

int main()
{
	int i,j;
	freopen(IN,"r",stdin);
	scanf("%d",&N);
	for (i=1;i<=N;++i)
		scanf("%d",A+i);
	fclose(stdin);
	
	sort(A+1,A+N+1);
	
	j=1;
	add(A[1],-A[1]);
	for (i=2;i<=N;++i)
	{
		if (A[i]==A[i-1]) continue;
		for (;j<L;){
			
			point x=intersect(d[j],d[j+1]);
			if (x.x<=i) ++j;
			else break;
		}
		int r=i*d[j].a+d[j].b;
		Rez=max(Rez,r+A[i]*(N-i+1));
		add(A[i],-A[i]*i);
	}
	
	freopen(OUT,"w",stdout);
	printf("%d\n",Rez);
	fclose(stdin);
	
	return 0;
}