Cod sursa(job #2699085)

Utilizator RaresFelixTudose Rares Felix RaresFelix Data 23 ianuarie 2021 17:30:55
Problema Avioane Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <bits/stdc++.h>
#define NMAX 111111
#define INF 1000000000
using namespace std;

ifstream fi("avioane.in");
ofstream fo("avioane.out");

long long n, A[NMAX], R1[NMAX];
deque<long long> SOL, TIMP;

long long timp(long long p1, long long p2)
/// timpul cand p2 mai profitabil decat p1
{
	if(A[p1]==A[p2])return INF;
	return p2 + ((p2 - p1) * A[p1] - 1)/(A[p2] - A[p1]) + 1;
}

int main() {
	fi >> n;
	for(long long i = 1; i <= n; i++)
		fi >> A[i];
	sort(A + 1, A + n + 1);
	SOL.push_back(1);
	R1[1] = A[1];
	for(long long i = 2; i <= n; i++) {
		if(SOL.size() > 1) {
			while(SOL.size() > 1 && TIMP.back() >= timp(SOL.back(),i)) {
				SOL.pop_back();
				TIMP.pop_back();
			}
		}
		TIMP.push_back(timp(SOL.back(),i));
		SOL.push_back(i);
		while(TIMP.front() <= i){
			TIMP.pop_front();
			SOL.pop_front();
		}
		R1[i] = A[SOL.front()] * (i-SOL.front()+1);
	}
//	for(long long i = 1; i <= n; i++)
//		fo << R1[i] << " ";
	long long rez = -INF;
	for(long long i = 2; i <= n; i++)
		rez = max(rez, R1[i-1] + A[i]*(n-i+1));
    fo << rez;
    return 0;
}