Cod sursa(job #2386451)

Utilizator wthICMurad Eynizade wthIC Data 22 martie 2019 23:17:21
Problema Avioane Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
/* Murad Eynizade */

#include <bits/stdc++.h>
#define intt long long
#define FAST_READ ios_base::sync_with_stdio(0);cin.tie(0);
#define F first
#define S second

using namespace std;

const int maxx = 100005;

struct line{
    intt k , b;
};

intt ew(line a,intt x) {
    return x * a.k + a.b;
}

line t[maxx * 4];

int n , arr[maxx];

intt dp[maxx] , res;

void add(int v,int l,int r,line nw) {
    int m = (l + r) >> 1;
    bool le = ew(nw , l) > ew(t[v] , l);
    bool mid = ew(nw , m) > ew(t[v] , m);
    if (mid)swap(nw , t[v]);
    if (r - l == 1)return;
    if (le != mid)add(v << 1,l,m,nw);
    else add(v << 1 | 1,m,r,nw);
}

intt get(int v,int l,int r,int x) {
    if (r - l == 1)return ew(t[v] , x);
    int m = (l + r) >> 1;
    if (x < m)return max( ew(t[v] , x) , get(v << 1 , l , m , x));
    else return max( ew(t[v] , x) , get(v << 1 | 1 , m , r , x));
}

int main()
{
    FAST_READ;
    freopen("avioane.in","r",stdin);
    freopen("avioane.out","w",stdout);
    cin>>n;
    for (int i = 0;i<n;i++)cin>>arr[i];
    sort(arr , arr + n);
    for (int i = 0;i<n;i++) {
        add(1 , 1 , maxx , {arr[i] , -1LL * (i - 1) * arr[i]});
        if (i == 0) {
            dp[i] = arr[i] + 1LL * (n - 1) * arr[i + 1];
            //cout<<i<<" "<<dp[i]<<endl;
            continue;
        }
        dp[i] = get(1 , 1 , maxx , i) + (n - i - 1) * arr[i + 1];
        //cout<<i<<" "<<dp[i]<<endl;
    }
    for (int i = 0;i<n;i++)res = max(res , dp[i]);
    cout<<res<<endl;
    return 0;
}