Cod sursa(job #2404825)

Utilizator shantih1Alex S Hill shantih1 Data 13 aprilie 2019 14:04:12
Problema Avioane Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <algorithm>
#define ll long long

using namespace std;
ifstream fin("avioane.in");
ofstream fout("avioane.out");

const ll inf=LLONG_MAX;
const ll minf=LLONG_MIN;
const int nmx=100005;

ll n,i,j,a,b,nr,p,tp;
ll dp[nmx],rez,k;

struct Per
{	ll a,b;
	bool operator<(const Per &alt)const
	{	return a<alt.a;	}
} stk[nmx],v[nmx];

ll linePoint(Per p1,Per p2)
{
	if(p1.a==p2.a)
		return inf;
	return (p2.b-p1.b)/(p1.a-p2.a);
}
ll fvalue(ll f,ll x)
{
	return v[f].a*x+v[f].b;
}

int main() {
	
	fin>>n;
	for(i=1;i<=n;i++)
		fin>>v[i].a;
	
	sort(v+1,v+n+1);
	
	for(i=1;i<=n;i++)
		v[i].b=v[i].a*(1-i);
		
	p=1;
	rez=v[1].a*n;
	stk[tp=1]={1,minf};
	
	for(i=2;i<=n;i++)
	{
		while(tp>1 && linePoint(v[stk[tp].a],v[i])<=stk[tp].b)
			tp--;
		
		k=linePoint(v[stk[tp].a],v[i]);
		if(k!=inf)	stk[++tp]={i, k};
		
		p=min(p,tp);
		while(p<tp && i>stk[p+1].b)
			p++;
		
		rez=max(rez, fvalue(stk[p].a, i)+(n-i)*v[i+1].a);
	}
	
	fout<<rez<<"\n";
}