Cod sursa(job #89766)

Utilizator mariusdrgdragus marius mariusdrg Data 7 octombrie 2007 16:50:56
Problema Euro Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>


const int maxn = 40000;

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


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

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

int main()
{
        freopen("euro.in","r",stdin);
        freopen("euro.out","w",stdout);
        scanf("%d %d",&n,&t);
        for(i = 1;i <= n; ++i)
        {
                scanf("%d",&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("%d\n",din[n]);

        return 0;
}