Cod sursa(job #1497150)

Utilizator akaprosAna Kapros akapros Data 6 octombrie 2015 10:58:48
Problema Euro Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxN 34569
using namespace std;
int n, i, j;
long long T;
long long x, s[maxN], dp[maxN], st, dr, d[maxN], t[maxN];
void left(int i)
{
    while (st < dr && t[d[st + 1]] == i)
        ++ st;
}
void right(int i)
{
    bool ok = 1;
    int pos, p, x, y;
    while (st <= dr)
    {
        pos = d[dr];
        t[i] = i;
        for (p = 1 << 16; p > 0; p >>= 1)
            if (t[i] + p <= n)
            {
                x = dp[pos] + (s[p + t[i]] - s[pos]) * (t[i] + p) * 1LL ;
                y = dp[i] + (s[p + t[i]] - s[i]) * (t[i] + p) * 1LL ;
                if (x > y)
                    t[i] += p;
            }
        ++ t[i];
        if (t[i] == n + 1)
        {
            ok = 0;
            break;
        }
        if (t[i] <= t[pos])
            -- dr;
        else
            break;
    }
    if (ok)
       d[++ dr] = i;
}
void read()
{
    freopen("euro.in", "r", stdin);
    scanf("%d %lld", &n, &T);

    for (i = 1; i <= n; ++ i)
    {
        scanf("%lld", &x);
        s[i] = s[i - 1] + x;
    }
}
void solve()
{
    st = 1; dr = 1;
    for (i = 1; i <= n; ++ i)
    {
        left(i);
        dp[i] = dp[d[st]] + (s[i] - s[d[st]]) * i * 1LL - T;
        right(i);
    }
}
void write()
{
    freopen("euro.out", "w", stdout);
    printf("%lld", dp[n]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}