Pagini recente » Cod sursa (job #2095016) | Cod sursa (job #161283) | Cod sursa (job #1396092) | Cod sursa (job #2001978) | Cod sursa (job #827235)
Cod sursa(job #827235)
#include <vector>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
const int NMAX = 100011;
int w[NMAX], v[NMAX];
long long int wValue[NMAX];
inline void precomputeW(int left, int right)
{
if(left > right) return;
int middle = (left + right) >> 1;
for(int i = w[left-1]; i <= w[right+1] && i < middle; ++i)
{
if(wValue[middle] < 1LL * v[i] * (middle-i))
{
w[middle] = i;
wValue[middle] = 1LL * v[i] * (middle - i);
}
}
precomputeW(left, middle-1);
precomputeW(middle+1, right);
}
inline long long int _max(long long int x, long long int y) {return x >= y ? x : y;}
int main()
{
int N, i, x;
long long int profit;
ifstream in("avioane.in");
ofstream out("avioane.out");
in >> N;
profit = 0;
switch(N)
{
case 2: in >> profit;
case 1: in >> x;
profit += x;
return EXIT_SUCCESS;
default: copy(istream_iterator<int>(in), istream_iterator<int>(), v + 1);
}
sort(v + 1, v + N + 1);
w[N + 1] = N ;
precomputeW(1, N);
for(i = 2; i <= N; ++i)
{
profit = _max(profit, wValue[i] + v[i] * (N - i + 1));
}
out << profit << '\n';
return EXIT_SUCCESS;
}