Pagini recente » Cod sursa (job #3036718) | Cod sursa (job #506314) | Cod sursa (job #1153568) | bulangandit6 | Cod sursa (job #1497132)
#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 = 0;
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;
}