Cod sursa(job #1832509)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 20 decembrie 2016 10:06:56
Problema Ferma Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#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;
}