Pagini recente » Cod sursa (job #888551) | Cod sursa (job #2128682) | Cod sursa (job #1439065) | Cod sursa (job #322902) | Cod sursa (job #1494888)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <deque>
#define DIM 20005
#define infile "ferma.in"
#define outfile "ferma.out"
const int inf = 2000000000;
int chickensProductivity[DIM];
int partialSum[DIM];
std::deque<int> deque;
int main() {
freopen(infile, "r", stdin);
freopen(outfile, "w", stdout);
int chickenCount, collectCount;
scanf("%d%d", &chickenCount, &collectCount);
for (int chicken = 1; chicken <= chickenCount; ++chicken) {
scanf("%d", 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;
}
printf("%d", solution);
return 0;
}
//Trust me, I'm the Doctor!