Pagini recente » Cod sursa (job #349070) | Cod sursa (job #1541278) | Cod sursa (job #1832509)
#include <cstdio>
#define MAXN 10000
int s[2*MAXN], v[MAXN+1], dq[2*MAXN];
int main(){
FILE *fin, *fout;
fin=fopen("ferma.in", "r");
fout=fopen("ferma.out", "w");
int n, k;
fscanf(fin, "%d%d", &n, &k);
for(int i=1; i<=n; i++){
fscanf(fin, "%d", &v[i]);
s[i]=s[i-1]+v[i];
}
for(int i=n+1; i<2*n; i++)
s[i]=s[i-1]+v[i-n];
int ans=0;
for(int i=1; i<=k; i++){
int st=0, dr=0, best=0, left=0, right=0;
dq[dr++]=s[0];
for(int j=1; j<2*n; j++){
if((st<dr)&&(j-dq[st]>n)) st++;
while((st<dr)&&(s[j]<s[dq[dr-1]])) dr--;
dq[dr++]=j;
if(s[j]-s[dq[st]]>best){
best=s[j]-s[dq[st]];
left=dq[st];
right=j;
}
}
ans+=best;
if(right<=n) for(int j=left+1; j<=right; j++) v[j]*=-1;
else{
for(int j=left+1; j<=n; j++) v[j]*=-1;
for(int j=1; j<=right-n; j++) v[j]*=-1;
}
for(int j=1; j<=n; j++)
s[j]=s[j-1]+v[j];
for(int j=n+1; j<2*n; j++)
s[j]=s[j-1]+v[j-n];
if(best==0) i=k+1;
}
fprintf(fout, "%d\n", ans);
fclose(fin);
fclose(fout);
return 0;
}