Cod sursa(job #64593)

Utilizator mariusdrgdragus marius mariusdrg Data 4 iunie 2007 14:38:31
Problema Euro Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>


const long long maxn = 60050;

long long i;
long long n;
long long k;
long long a[maxn];
long long din[maxn];
long long max(long long i,long long j)
{
        return i > j ? i : j;
}
long long st[maxn];
long long m;
long long t;
long long sump[maxn];
long long l;
long long j;
long long sol[maxn];
long long sum;

int main()
{
        freopen("euro.in","r",stdin);
        freopen("euro.out","w",stdout);
        scanf("%lld %lld",&n,&k);
        for(i = 1;i <= n; ++i)
        {
                scanf("%lld",&a[i]);
                sump[i] = sump[i - 1] + a[i];
        }
        for(i = 1;i <= n; ++i)
        {
                sum += a[i];
                if (sum < 0 || i == n)
                {
                        while((long long)(sump[i] - sump[st[l - 1]]) * i + sol[st[l - 1]] - k > (long long)(sump[i] - sump[st[l]]) * i + sol[st[l]] - k && l > 0)
                        {
                        
                                --l;
                        }
                        sol[i] = (sump[i] - sump[st[l]]) * i + sol[st[l]] - k;
                        sum = 0;
                        ++l;
                        st[l] = i;
                }

        }
        printf("%lld\n",sol[n]);

        return 0;
}