Pagini recente » Cod sursa (job #776836) | Cod sursa (job #1554734) | Cod sursa (job #2912785) | Cod sursa (job #2014691) | Cod sursa (job #1563886)
#include <fstream>
#include <vector>
#include <deque>
int main()
{
std::ifstream fin("ferma.in");
std::ofstream fout("ferma.out");
int n, k;
fin >> n >> k;
std::vector < int > prod(2 * n + 5);
for(int i = 1 ; i <= n ; ++i)
{
fin >> prod[i];
prod[i + n] = prod[i];
}
std::vector < int > part(2 * n + 5);
int sol = 0;
for(int i = 1 ; i <= k ; ++i)
{
std::deque < int > dq;
int ans = -(1 << 30);
int left, right;
dq.push_back(0);
for(int j = 1 ; j < 2 * n ; ++j)
{
part[j] = part[j - 1] + prod[j];
if(!dq.empty() && j - dq.back() == n)
dq.pop_back();
if(part[j] - part[dq.back()] > ans)
{
ans = part[j] - part[dq.back()];
left = dq.back() + 1;
right = j;
}
while(!dq.empty() && part[j] <= part[dq.front()])
{
dq.pop_front();
}
dq.push_front(j);
}
for(int j = left ; j <= right ; ++j)
{
int l = (j <= n ? j : j - n);
prod[l] *= -1;
prod[l + n] *= -1;
}
sol += ans;
}
fout << sol;
return 0;
}