Pagini recente » Cod sursa (job #3032640) | Cod sursa (job #2793730) | Cod sursa (job #2639760) | Cod sursa (job #1757838) | Cod sursa (job #1534229)
#include <bits/stdc++.h>
#define INF (1 << 30)
#define LLINF (1LL << 62)
#define mod 666013
using namespace std;
typedef long long LL;
int n, i, j, ok;
LL sol, mx, rez;
int v[100005];
LL ternary(int st, int dr, int m)
{
if(st > dr)
return 0;
if(st == dr)
{
return 1LL * v[st] * (m - st + 1);
}
if(st == dr - 1)
{
int mij1 = st;
int mij2 = dr;
return max(1LL * v[mij1] * (m - mij1 + 1), 1LL * v[mij2] * (m - mij2 + 1));
}
int mij1 = st + (dr - st) / 3;
int mij2 = st + ( 2 * (dr - st) ) / 3;
if( 1LL * v[mij1] * (m - mij1 + 1) > 1LL * v[mij2] * (m - mij2 + 1) )
return max( ternary(st, mij2 - 1, m), 1LL * v[mij1] * (m - mij1 + 1) );
else
return max( ternary(mij1 + 1, dr, m), 1LL * v[mij2] * (m - mij2 + 1) );
}
LL ternary2(int st, int dr, int val)
{
if(st > dr)
return 0;
if(st == dr)
{
return 1LL * (v[st] - val) * (n - st + 1);
}
if(st == dr - 1)
{
int mij1 = st;
int mij2 = dr;
return max(1LL * (v[mij1] - val) * (n - mij1 + 1), 1LL * (v[mij2] - val) * (n - mij2 + 1));
}
int mij1 = st + (dr - st) / 3;
int mij2 = st + ( 2 * (dr - st) ) / 3;
if( 1LL * (v[mij1] - val) * (n - mij1 + 1) > 1LL * (v[mij2] - val) * (n - mij2 + 1) )
return max( ternary2(st, mij2 - 1, val), 1LL * (v[mij1] - val) * (n - mij1 + 1) );
else
return max( ternary2(mij1 + 1, dr, val), 1LL * (v[mij2] - val) * (n - mij2 + 1) );
}
class Reader
{
private:
char buff[100805];
int buffer, cnt;
public:
Reader()
{
buffer = 1 << 15;
cnt = buffer - 1;
}
char gChar()
{
if(++cnt == buffer)
{
cnt = 0;
fread(buff, buffer, 1, stdin);
}
return buff[cnt];
}
int gInt()
{
int nr = 0;
char ch = gChar();
while(ch < '0' || '9' < ch)
ch = gChar();
while('0' <= ch && ch <= '9')
{
nr = nr * 10 + ch - '0';
ch = gChar();
}
return nr;
}
};
Reader rdr;
int main()
{
freopen("avioane.in", "r", stdin);
freopen("avioane.out", "w", stdout);
n = rdr.gInt();
for(i = 1; i <= n; i++)
v[i] = rdr.gInt();
sort(v + 1, v + n + 1);
for(i = 2; i <= n; i++)
{
sol = 1LL * v[i] * (n - i + 1);
sol += ternary(1, i - 1, i - 1);
mx = max(mx, sol);
}
for(i = 1; i < n; i++)
{
sol = 1LL * v[i] * (n - i + 1);
sol += ternary2(i + 1, n, v[i]);
mx = max(sol, mx);
}
printf("%lld", mx);
return 0;
}