Cod sursa(job #2986716)

Utilizator user12345user user user user12345 Data 28 februarie 2023 23:00:57
Problema Avioane Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("avioane.in");
ofstream fout("avioane.out");

int n, v[100001];
typedef long long ll;

struct line
{
    int a, b;

    inline line(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }

    inline ll operator()(int k)
    {
        return 1LL * a * k + b;
    }
};

line t[300001];

void update(line k, int i = 1, int l = 1, int r = n)
{
    if (l == r)
    {
        if (k(l) > t[i](l))
            t[i] = k;
        return;
    }

    int m = (l + r) >> 1;

    if (t[i].a > k.a)
        swap(t[i], k);

    if (t[i](m) < k(m))
    {
        swap(t[i], k);
        update(k, i << 1, l, m);
    }
    else
        update(k, (i << 1) + 1, m + 1, r);
}

long long query(int x, int i = 1, int l = 1, int r = n)
{
    if (l == r)
        return t[i](x);

    int m = (l + r) >> 1;

    if (x < m)
        return max(t[i](x), query(x, (i << 1), l, m));
    return max(t[i](x), query(x, (i << 1) + 1, m + 1, r));
}

int main()
{
    fin >> n;

    for (int i = 1; i <= n; i++)
        fin >> v[i];

    sort(v + 1, v + n + 1);

    long long maxi = 1LL * v[1] * n;

    for (int i = 1; i <= n; i++)
    {
        update(line(v[i], -1LL * i * v[i]));
        maxi = max(maxi, query(i) + 1LL * v[i] * (n - i + 1));
    }

    fout << maxi;

    return 0;
}