Pagini recente » Cod sursa (job #476595) | Cod sursa (job #914862) | Cod sursa (job #1568998) | Cod sursa (job #2259237) | Cod sursa (job #1464523)
#include <cstdio>
using namespace std;
const int nmax = 20000;
const int inf = 2000000000;
int a[nmax+5];
int sp[nmax+5];
int d[nmax+5];
int main()
{
freopen("ferma.in", "r", stdin);
freopen("ferma.out", "w", stdout);
int n, k;
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
a[i+n] = a[i];
}
int ans = 0;
for(int i=1; i<=k; i++)
{
int st = 1, dr = 0;
d[++dr] = 0;
int Max = -inf, ans_st, ans_dr;
for(int j=1; j<2*n; j++)
{
if(st <= dr && j-d[st] == n)
st++;
sp[j] = sp[j-1] + a[j];
if(sp[j] - sp[d[st]]>Max)
{
Max = sp[j] - sp[d[st]];
ans_st = d[st] + 1;
ans_dr = j;
}
while(st<=dr && sp[j] <= sp[d[dr]])dr--;
d[++dr] = j;
}
for(int j=ans_st; j<=ans_dr; j++)
{
a[j] = -a[j];
if(j<=n)a[j+n] = -a[j+n];
else a[j-n] = -a[j-n];
}
ans+=Max;
}
printf("%d\n", ans);
return 0;
}