Cod sursa(job #711188)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 11 martie 2012 16:10:46
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <stdio.h>
#include <math.h>

int n, k;
int v[35000], sp[35000], d[35000], poz[35000];

long long sol[35000];

inline long long max (long long a, long long b) {return a > b ? a : b;}

int main ()
{
	freopen ("euro.in", "r", stdin);
	freopen ("euro.out", "w", stdout);
	
	scanf ("%d %d", &n, &k);
	
	int i, j;
	
	for (i = 1; i <= n; i ++)
		scanf ("%d", &v[i]);
	
	d[0] = 1;
	for (i = 1; i <= n; i ++)
	{
		if (d[d[0]] >= 0)
			d[d[0]] += v[i];
		else
			d[++ d[0]] = v[i];
		poz[d[0]] = i;
	}
	
	for (i = 1; i <= d[0]; i ++)
		sp[i] = sp[i - 1] + d[i];
	
	int lim = 2 * sqrt (k);
	
	for (i = 1; i <= d[0]; i ++)
		sol[i] = -1000000000000000ll;
	
	for (i = 1; i <= d[0]; i ++)
		for (j = max (i - lim, 0); j < i; j ++)
			sol[i] = max (sol[i], sol[j] + (sp[i] - sp[j]) * (long long)poz[i] - k);
	printf ("%lld\n", sol[d[0]]);
	return 0;
}