Cod sursa(job #1194873)

Utilizator vld7Campeanu Vlad vld7 Data 4 iunie 2014 23:37:05
Problema Avioane Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 0.81 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int MAX_N = 100005;

ifstream f("avioane.in");
ofstream g("avioane.out");

int n, a[MAX_N];
long long best[MAX_N], win[MAX_N], ans;

void solve (int lo, int hi) {
	if (lo <= hi) {
		long long mid = (lo + hi) / 2;
		for (int i = best[lo - 1]; i <= min (best[hi + 1], mid); i++)
			if (1LL * a[mid] * (n - mid + 1) + 1LL * a[i] * (mid - i) >= win[mid]) {
				best[mid] = i;
				win[mid] = a[mid] * (n - mid + 1) + a[i] * (mid - i);
			}
		solve (lo, mid - 1);
		solve (mid + 1, hi);
	}
}

int main() {
	f >> n;
	for (int i = 1; i <= n; i++)
		f >> a[i];
	sort (a + 1, a + n + 1);
	
	best[0] = 1;
	best[n + 1] = n;
	
	solve (1, n);
	for (int i = 2; i <= n; i++)
		ans = max (ans, win[i]);
	
	g << ans;
	
	return 0;
}