Cod sursa(job #602679)

Utilizator S7012MYPetru Trimbitas S7012MY Data 12 iulie 2011 15:36:43
Problema Avioane Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <iostream>
#include <fstream>
#include <list>
#include <algorithm>
#define LL long long
#define MULT 0x3f3f3f3f
#define DN 100005
#define x first // cat ai
#define y second// cat scazi
using namespace std;

typedef pair<int, int> per;
typedef list<per>::iterator it;

int n,v[DN],lst[DN];
per cnd[DN];
//list<per> lst;
LL rez;

bool cmp(const per &a, const per &b) {
	return a>b;
}

int form(int i,int j) {
	LL ret;
	if(v[i]==v[j]) return MULT;
	ret=(1LL*j*v[j]-1LL*i*v[i])/(v[j]-v[i]);
	return min(ret,1LL*MULT);
}

int main()
{
	ifstream f("avioane.in");
	ofstream g("avioane.out");
	f>>n;
	for(int i=1; i<=n; ++i) f>>v[i];
	sort(v+1,v+n+1);
	rez=1LL*v[1]*n;
	int ls,ld;
	lst[ls=ld=0]=1;
	for(int i=2; i<=n; ++i) {
		for(;1<=ld-ls && form(lst[ld],i)<=form(lst[ld-1],lst[ld]);--ld);
		lst[++ld]=i;
		if(1<=ld-ls && form(lst[ls],lst[ls+1])==i) ++ls;
		rez=max(rez,1LL*(n-i+1)*v[i]+v[lst[ls]]*(i-lst[ls]));
	}
	g<<rez;
	cout<<rez;
	return 0;
}