Cod sursa(job #2753546)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 23 mai 2021 12:51:22
Problema Avioane Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
	
#include <bits/stdc++.h>
#define nozerous(x) (x & -x)
#define MOD 9901
#define EPS 0.00001
using namespace std;
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int INF = (1 << 30), NMAX(100005), VMAX(1000000);
using VI  = vector<int>;
using VVI = vector<VI>;
using VB  = vector<bool>;
using Point = array<int, 2>;
using ll = long long;
using cd = complex<double>;
const double PI = acos(-1);
void BUNA(const string& task = "")
{
    if (!task.empty())
        freopen((task + ".in").c_str(), "r", stdin),
                freopen((task + ".out").c_str(), "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}
void PA()
{
    exit(0);
}
int v[NMAX], n;
ll rez = -1;
inline void solve(int st, int dr, int limS, int limD){ ///convex hull trick
	if(st > dr)
		return;
	int mij = (st + dr) / 2;
	ll maxx = -1;
	int wh = -1;
	for(int i = limS; i < min(mij, limD + 1); ++i)
		if(1ll * v[i] * (mij - i) > maxx){
			maxx = 1LL * v[i] * (mij - i);
			wh = i;
		}
	rez = max(rez, maxx + 1LL * (n - mij + 1) * v[mij]);
	solve(st, mij - 1, limS, wh);
	solve(mij + 1, dr, wh, limD);
}
int main()
{
    BUNA("avioane");
    cin >> n;
    for(int i = 1; i <= n; ++i)
		cin >> v[i];
	sort(v + 1, v + n + 1);
	solve(1, n, 1, n);
	cout << rez << '\n';
    PA();
}