Cod sursa(job #992622)

Utilizator primulDarie Sergiu primul Data 2 septembrie 2013 10:43:52
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
 
int N, M = -1;
int v[100011];
vector <pair <int, int> > S;
 
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));
    }
    M = S.size ();
}
 
int B_Search (int val)
{
    int i, step = 1 << 17;
    for (i = 0; step; step >>= 1)
        if (i + step <= M && S[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 = S[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;
}