Pagini recente » Cod sursa (job #2204044) | Cod sursa (job #1002218) | Cod sursa (job #2052306) | Cod sursa (job #75321) | Cod sursa (job #23348)
Cod sursa(job #23348)
#include <stdio.h>
#define MAXN (1 << 16)
#define max(a,b) ((a) > (b) ? (a) : (b))
typedef long long llong;
const int SQRT = 380;
int N;
llong T, P, A[MAXN], S[MAXN], end[MAXN];
llong best[MAXN];
void baga_brute(void)
{
int i, j;
llong sum;
for(i = 1; i <= N; i++)
{
best[i] = best[i-1]+A[i]*i, sum = A[i];
for(j = i-1; j >= 1; j--)
{
sum += A[j];
best[i] = max(best[i], sum*i+best[j-1]);
}
best[i] -= T;
}
}
void solve(void)
{
int i, j, sum;
for(i = 1, sum = 0; i < N; i++)
{
sum += A[i];
if(sum < 0)
S[++P] = sum, end[P] = i, sum = 0;
}
sum += A[N], S[++P] = sum, end[P] = N;
for(i = 1; i <= P; i++)
{
best[i] = (llong)S[i]*end[i]+best[i-1], sum = S[i];
for(j = i-1; j >= i-SQRT && j >= 1; j--)
{
sum += S[j];
best[i] = max(best[i], (llong)sum*end[i]+best[j-1]);
}
best[i] -= (llong)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();
baga_brute();
//write_data();
printf("%lld\n", best[N]);
return 0;
}