Pagini recente » Cod sursa (job #1246037) | Cod sursa (job #1885349) | Cod sursa (job #2102158) | Cod sursa (job #2585757) | Cod sursa (job #1228960)
#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;
}