Cod sursa(job #1869847)

Utilizator contnouAndrei Pavel contnou Data 6 februarie 2017 10:55:47
Problema Fabrica Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <algorithm>
#define MAXN 100005

using namespace std;

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

struct queueItem {
	long long value;
	long long position;
	long long leadPrevisionedPos;

	queueItem() {
		value = 0;
		position = 0;
		leadPrevisionedPos = 0;
	}

	queueItem(long long gValue, long long gPosition, long long gLeadProvisionedPos) {
		value = gValue;
		position = gPosition;
		leadPrevisionedPos = gLeadProvisionedPos;
	}
};

void readData(long long *sums, long long &sumsLength) {
	//
	f >> sumsLength;
	for (long long i = 0; i < sumsLength; i++) {
		f >> sums[i];
	}
}

long long getMax(long long m1, long long m2) {
	//
	return m1 > m2 ? m1 : m2;
}

void getMaximumProfit(long long *sums, long long sumsLength, long long &maximumProfit) {
	//
	queueItem q[MAXN];
	long long qStart = 0, qEnd = 0;
	maximumProfit = 0;
	q[qStart] = queueItem(sums[0], 0, 0);

	sort(sums, sums + sumsLength);

	for (long long i = 1; i < sumsLength; i++) {
		//
		if (sums[i] - q[qEnd].value == 0) continue;
		if (qStart < qEnd && q[qStart + 1].leadPrevisionedPos <= i - 1) qStart++;

		long long sumRight = sums[i] * (sumsLength - i);
		long long sumLeft = (i - q[qStart].position) * q[qStart].value;

		maximumProfit = getMax(maximumProfit, sumLeft + sumRight);

		while (qEnd >= qStart && (q[qEnd].leadPrevisionedPos >= i + ((q[qEnd].value * (i - q[qEnd].position)) / (sums[i] - q[qEnd].value)))) {
			qEnd--;
		}

		q[qEnd + 1] = queueItem(sums[i], i, i + ((q[qEnd].value * (i - q[qEnd].position)) / (sums[i] - q[qEnd].value)));
		qEnd++;
	}

	return;
}

int main() {
	//
	long long sums[MAXN], sumsLength;
	long long maximumProfit;

	readData(sums, sumsLength);
	getMaximumProfit(sums, sumsLength, maximumProfit);
	g << maximumProfit;

	return 0;
}