Cod sursa(job #89767)

Utilizator mariusdrgdragus marius mariusdrg Data 7 octombrie 2007 16:52:18
Problema Euro Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>


const int maxn = 40000;

long long c[maxn];
long long dq[maxn];
long long i;
long long st;
long long t;
long long sp[maxn];
long long din[maxn];
long long n;


long long sum(long long i,long long j)
{
        return sp[i] - sp[j - 1];
}

long long better(long long poz1,long long poz2)
{
        return sum(poz2,poz1 + 1) * i < din[poz2] - din[poz1];
}

int main()
{
        freopen("euro.in","r",stdin);
        freopen("euro.out","w",stdout);
        scanf("%lld %lld",&n,&t);
        for(i = 1;i <= n; ++i)
        {
                scanf("%lld",&c[i]);
                sp[i] = sp[i - 1] + c[i];
        }
        st = 1;
        dq[0] = 1;
        for(i = 1;i <= n; ++i)
        {
                while(better(dq[st],dq[st + 1]) && st < dq[0])
                {
                        ++st;
                }
                din[i] = din[dq[st]] + sum(i,dq[st] + 1) * i - t;
                while( better(dq[dq[0]],i) && dq[0] >= st)
                {
                        dq[0]--;
                }
                dq[0]++;
                dq[dq[0]] = i;
        }
        printf("%lld\n",din[n]);

        return 0;
}