Pagini recente » Cod sursa (job #595591) | Cod sursa (job #2617274) | Cod sursa (job #1659638) | Cod sursa (job #3201466) | Cod sursa (job #957614)
Cod sursa(job #957614)
#include <fstream>
#include <algorithm>
#include <vector>
#define TR(C, it) for (typeof (C.begin ()) it = C.begin (); it != C.end (); it++)
using namespace std;
int N, M = -1;
int v[100011];
vector <pair <int, int> > S;
pair <int, int> best[100011];
void Citire ()
{
ifstream fin ("avioane.in");
fin >> N;
for (int i = 0; i < N; i++)
fin >> v[i];
sort (v, v + N);
fin.close ();
}
void Precalc ()
{
S.push_back (make_pair (0, 0));
for (int i = 1; i < N; i++)
{
bool bad = 0;
long long j;
while (!S.empty ())
{
if (v[S.back ().first] == v[i])
{
bad = 1;
break;
}
int a = S.back ().first;
long long A = 1LL * S.back ().second;
j = (1LL * i * v[i] - 1LL * a * v[a]) / (v[i] - v[a]);
if (j * (v[i] - v[a]) != (1LL * i * v[i] - 1LL * a * v[a])) j++;
if (j <= A) S.pop_back ();
else
{
if (j > 1LL * N) bad = 1;
break;
}
}
if (!bad) S.push_back (make_pair (i, j));
}
TR (S, it)
best[++M] = *it;
}
int B_Search (int val)
{
int i, step = 1 << 17;
for (i = 0; step; step >>= 1)
if (i + step <= M && best[i + step].second <= val) i += step;
return i;
}
long long Business ()
{
if (N == 1) return v[0];
long long sol = 1LL * -2000000000 * 1000000;
for (int j = 2; j <= N; j++)
{
int i = best[B_Search (j)].first;
long long a = 1LL * (N - j) * v[j] + 1LL * (j - i) * v[i];
if (a > sol) sol = a;
}
return sol;
}
void Scriere ()
{
ofstream fout ("avioane.out");
fout << Business ();
fout.close ();
}
int main ()
{
Citire ();
Precalc ();
Scriere ();
return 0;
}