Cod sursa(job #1228960)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 15 septembrie 2014 22:52:49
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <algorithm>
#include <stack>
using namespace std;
ifstream f("avioane.in");
ofstream g("avioane.out");
long long N,Array[100005],Val[100005],Result,Numbers[100005],Apar[100005],Next[100005];
bool Ok[100005];
stack <int> S;
void Read()
{
    f>>N;
    for(long long i=1;i<=N;i++)
        f>>Array[i];
    sort(Array+1,Array+N+1);
}
void precalcVal()
{
    long long i=N,sum=0;
    for(long long i=Numbers[0];i>=1;i--)
    {
        sum+=Apar[i];
        Val[i]=Numbers[i]*sum;
    }
}
void precalcNext()
{
    for(int i=1;i<=Numbers[0];i++)
    {
        while(!S.empty() && Val[i]>=Val[S.top()])
        {
            Next[S.top()]=i;
            S.pop();
        }
        S.push(i);
    }
}
void precalc()
{
    long long i=1,last=1;
    while(i<=N)
    {
        long long j=i,counter=1;
        while(j<=N && Array[j]==Array[j+1])
        {
            ++j;
            counter++;
        }
        Numbers[++Numbers[0]]=Array[i];
        Apar[Numbers[0]]=counter;
        i=j+1;
    }
}
void Solve()
{
    long long i,last=1;
    for(i=1;i<=Numbers[0];i++)
    {
        if(Next[i]!=0)
            continue;
        long long Max=0;
        for(int j=last;j<i;j++)
        {
            if(j!=i-1)
                Apar[j]+=Apar[i-1];
            if(Max<=Numbers[j]*Apar[j])
            {
                Max=Numbers[j]*Apar[j];
                last=j;
            }
        }
        Result=max(Result,Max+Val[i]);
    }
}
int main()
{
    Read();
    precalc();
    precalcVal();
    precalcNext();
    Solve();
    g<<Result<<"\n";
    return 0;
}