Pagini recente » Cod sursa (job #1533931) | Cod sursa (job #2415058) | Cod sursa (job #279627) | Cod sursa (job #1208812) | Cod sursa (job #1181126)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream F("avioane.in");
ofstream G("avioane.out");
const int N = 100010;
const long long infi = 1LL<<45;
int n,v[N],deque[N];
long long ans;
long long better(const int i, const int j)
{
if ( v[i] == v[j] ) return infi;
int l = j - i + 1;
if ( 1LL*v[i]*l < 1LL*v[j] ) return -infi;
long long dif1 = 1LL*v[i]*l-v[j];
long long dif2 = v[j]-v[i];
return (dif1 / dif2) + ( ( max(dif1,-dif1) % dif2 ) ? 1LL : 0LL );
}
long long cost(int i,int j)
{
return 1LL*v[j]*(n-j+1) + 1LL*v[i]*(j-i);
}
int main()
{
F>>n;
int now = 0;
for (int i=1,x;i<=n;++i)
{
F>>x;
if ( x > 0 ) v[++now] = x;
}
n = now;
sort(v+1,v+n+1);
ans = max(ans,cost(1,2));
int st = 1 ,dr = 1;
deque[st] = 1;
for (int i=3;i<=n;++i)
{
ans = max(ans,cost(deque[st],i));
while ( ( st < dr && 1LL*deque[st+1] + better(deque[st],deque[st+1]) <= 1LL*i - 1LL ) ) ++st , ans = max(ans,cost(deque[st],i));
if ( v[i-1] == v[deque[dr]] ) continue;
while ( dr > st && 1LL*(i-1) + better(deque[dr],i-1) <= deque[dr] + better(deque[dr-1],deque[dr]) ) --dr;
deque[++dr] = i-1;
if ( st <= dr ) ans = max(ans,cost(deque[st],i));
}
G<<ans<<'\n';
}