Cod sursa(job #827240)

Utilizator BitOneSAlexandru BitOne Data 1 decembrie 2012 21:04:59
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#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 = 1; i <= N; ++i)
   {
      profit = _max(profit, wValue[i] + 1LL * v[i] * (N - i + 1));
   }
   out << profit << '\n';

   return EXIT_SUCCESS;
}