Cod sursa(job #1494884)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 1 octombrie 2015 22:46:48
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <deque>

#define DIM 20005
#define infile "ferma.in"
#define outfile "ferma.out"

std::ifstream fin(infile);
std::ofstream fout(outfile);

const int inf = 2000000000;

int chickensProductivity[DIM];

int partialSum[DIM];

std::deque<int> deque;

int main() {

	int chickenCount, collectCount;

	fin >> chickenCount >> collectCount;

	for (int chicken = 1; chicken <= chickenCount; ++chicken) {

		fin >> chickensProductivity[chicken];

		chickensProductivity[chicken + chickenCount] = chickensProductivity[chicken];

	}


	int solution = 0;

	for (int collect = 1; collect <= collectCount; ++collect) {

		deque.clear();

		deque.push_back(0);

		int currAns = -inf, leftEndAns, rightEndAns;

		for (int chicken = 1; chicken < 2 * chickenCount; ++chicken) {

			partialSum[chicken] = partialSum[chicken - 1] + chickensProductivity[chicken];

			if (!deque.empty() && chicken - deque.front() == chickenCount) {

				deque.pop_front();

			}


			if (partialSum[chicken] - partialSum[deque.front()] > currAns) {

				currAns = partialSum[chicken] - partialSum[deque.front()];

				leftEndAns = deque.front() + 1;

				rightEndAns = chicken;

			}

			while (!deque.empty() && partialSum[chicken] <= partialSum[deque.back()]) {

				deque.pop_back();

			}

			deque.push_back(chicken);

		}

		for (int chicken = leftEndAns; chicken <= rightEndAns; ++chicken) {

			int temp = (chicken <= chickenCount ? chicken : chicken - chickenCount);

			chickensProductivity[temp] *= -1;
			chickensProductivity[temp + chickenCount] *= -1;

		}

		solution += currAns;

	}


	fout << solution;

	return 0;

}

//Trust me, I'm the Doctor!