Pagini recente » Cod sursa (job #2887302) | Cod sursa (job #2544892) | Cod sursa (job #758015) | Cod sursa (job #3225165) | Cod sursa (job #827231)
Cod sursa(job #827231)
#include <vector>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
const int NMAX = 100011;
int w[NMAX];
vector<int> v;
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]; 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>(), back_inserter(v));
}
sort(v.begin(), v.end());
w[N] = N - 1;
precomputeW(0, N-1);
for(i = 0; i < N; ++i)
{
profit = _max(profit, wValue[i] + v[i] * (N - i));
}
out << profit << '\n';
return EXIT_SUCCESS;
}