bzoj1010
#include <bits/stdc++.h> using namespace std; #define rep(i, l, r) for (LL i = l; i <= r; i++) #define REP(i, l, r) for (LL i = l; i >= r; i--) #define MAXN 1000010 typedef long long LL; LL n, L, c[MAXN], f[MAXN], top, sumc[MAXN]; struct interval {LL i, l, r;} stk[MAXN]; inline LL sum(LL l, LL r) {return sumc[r] - sumc[l-1];} inline LL sqr(LL n) {return n*n;} inline LL cost(LL l, LL r) {return sqr(r-l + sum(l, r) - L);} inline LL F(LL x, LL j) {return f[j] + cost(j+1, x);} inline LL search(LL L, LL R, LL cur, LL old) { while (R-L > 1) { LL mid = (L+R) >> 1; if (F(mid, cur) <= F(mid, old)) R = mid; else L = mid; } return (F(L, cur) <= F(L, old)) ? L : R; } int main() { cin >> n >> L; rep(i, 1, n) scanf("%lld", c + i), sumc[i] = sumc[i-1] + c[i]; stk[top = 1] = interval{0, 1, n}; rep(i, 1, n) { interval cur = interval{i, i+1, n}, state; REP(j, top, 1) if (stk[j].l <= i && stk[j].r >= i) {state = stk[j]; break;} f[i] = F(i, state.i); while (stk[top].l > i && F(stk[top].l, i) <= F(stk[top].l, stk[top].i)) cur.l = stk[top].l, top--; if (F(n, i) >= F(n, stk[top].i)) continue; LL mid = search(i+1, n, i, stk[top].i); stk[top].r = mid-1; cur.l = mid; stk[++top] = cur; } cout << f[n] << endl; return 0; }