Cod sursa(job #1976808)

Utilizator danstefanDamian Dan Stefan danstefan Data 4 mai 2017 11:40:40
Problema Avioane Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>
#define inf 1e12
using namespace std;
int n,i,ma,mi,j;
long long ans;
double inter[100010];
pair<int,int>v[100010];
vector<int>s;
double intersectie(pair<int,int> a,pair<int,int> b)
{
    if(a.first==b.first)return inf;
    return 1.0*(b.second-a.second)/(a.first-b.first);
}
int main()
{
    ifstream f ("avioane.in");
    ofstream g ("avioane.out");
    f>>n;
    for(i=1; i<=n; ++i)
        f>>v[i].first;
    sort(v+1,v+n+1);
    for(i=1; i<=n; ++i)
        v[i].second=-v[i].first*i;
    inter[0]=-inf;
    for(i=1; i<=n; ++i)
    {
        while(!s.empty()&&inter[s.size()-1]>=intersectie(v[i],v[s.back()]))s.pop_back();
        if(!s.empty())inter[s.size()]=intersectie(v[i],v[s.back()]);
        s.push_back(i);
    }
    for(i=1; i<=n; ++i)
    {
        while(j<s.size()-1&&inter[j+1]<=i)++j;
        ma=v[i].first;
        mi=v[s[j]].first;
        ans=max(ans,1LL*mi*i+1LL*ma*(n-i+1)+1LL*v[s[j]].second);
    }
    g<<ans;
    return 0;
}