Cod sursa(job #1464519)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 23 iulie 2015 18:40:16
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>

using namespace std;

const int nmax = 10000;
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];
			a[(j+n)%(2*n)] = -a[(j+n)%(2*n)];
		}
		ans+=Max;
	}
	printf("%d\n", ans);
    return 0;
}