Pagini recente » Cod sursa (job #2682200) | Cod sursa (job #2183641) | Cod sursa (job #1819472) | Cod sursa (job #2346771) | Cod sursa (job #1436139)
#include <algorithm>
#include <deque>
#include <fstream>
#include <iostream>
using namespace std;
const int MAX_N = 20005;
const int INFINITE = 1000000000;
int n, a[MAX_N];
int sp[MAX_N];
int dq[MAX_N];
int flip() {
int p = 1, u = 0;
dq[++ u] = 0;
int answer = -INFINITE, first = -1, last = -1;
for (int i = 1; i <= 2 * n - 1; ++ i) {
sp[i] = sp[i - 1] + a[i];
if (p <= u && i - dq[p] == n) {
++ p;
}
if (answer < sp[i] - sp[dq[p]]) {
answer = sp[i] - sp[dq[p]];
first = dq[p] + 1; last = i;
}
while (p <= u && sp[i] <= sp[dq[u]]) {
-- u;
}
dq[++ u] = i;
}
for (int i = first; i <= last; ++ i) {
if (i <= n) {
a[i] = -a[i];
a[i + n] = -a[i + n];
} else {
a[i] = -a[i];
a[i - n] = -a[i - n];
}
}
return answer;
}
int main() {
ifstream fin("ferma.in");
ofstream fout("ferma.out");
int k;
fin >> n >> k;
for (int i = 1; i <= n; ++ i) {
fin >> a[i];
a[i + n] = a[i];
}
int answer = 0;
for (int i = 1; i <= k; ++ i) {
answer += flip();
}
fout << answer << "\n";
return 0;
}