Pagini recente » Cod sursa (job #2262477) | Cod sursa (job #340691) | Cod sursa (job #2651145) | Cod sursa (job #2371467) | Cod sursa (job #23392)
Cod sursa(job #23392)
#include <stdio.h>
#define MAXN (1 << 16)
typedef long long llong;
const int SQRT = 380;
int N;
llong T, P, A[MAXN], S[MAXN], end[MAXN];
llong best[MAXN];
void solve(void)
{
int i, j, k, fin;
llong aux, r, sum;
for(i = 1, sum = 0; i < N; i++)
{
sum += (llong)A[i];
if(sum < 0)
S[++P] = sum, end[P] = (llong)i, sum = 0;
}
sum += (llong)A[N], S[++P] = sum, end[P] = (llong)N;
for(i = 1; i <= P; i++)
{
r = S[i]*end[i]+best[i-1], sum = S[i];
for(j = i-1; j >= i-SQRT && j >= 1; j--)
{
sum += S[j];
aux = sum*end[i]+best[j-1];
if(aux > r)
r = aux;
}
best[i] = r-T;
}
}
void read_data(void)
{
int i;
scanf("%d %lld\n", &N, &T);
for(i = 1; i <= N; i++)
scanf("%lld ", &A[i]);
}
void write_data(void)
{
printf("%lld\n", best[P]);
}
int main(void)
{
freopen("euro.in", "rt", stdin);
freopen("euro.out", "wt", stdout);
read_data();
solve();
write_data();
return 0;
}