RT,理论上是O(n)过不了?
#include<bits/stdc++.h>
using namespace std;
const int N = 5 * 1e5 + 10;
int a[N],n,type;
long long pre[N];
long long ans = 0x3f3f3f3f3f3f3f;
long long dp[N];
long long v[N];
int site[N];
int head = 0, tail = -1;
int g[N];
inline int fid(int x){
for(int i = tail;i >= head;i--){
if(v[site[i]] <= pre[x]) return site[i];
}
}
int main(){
scanf("%d%d",&n, &type);
pre[0] = 0;
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
pre[i] = pre[i - 1] + a[i] * 1ll;
}
memset(dp,63,sizeof(dp));
for(int j = 0; j <= n;j++){
dp[j] = (pre[j] - pre[0]) * (pre[j] - pre[0]);
}
g[0] = 0;
for(int i = 1;i <= n;i++){
int maxk = fid(i);
g[i] = maxk;
dp[i] = dp[maxk] + (pre[i] - pre[maxk]) * (pre[i] - pre[maxk]);
v[i] = 2 * pre[i] - pre[g[i]];
while (head <= tail && v[site[tail]] >= v[i]) --tail;
site[++tail] = i;
while(site[head] < g[i]) ++head;
}
ans = dp[n];
printf("%lld\n",ans);
return 0;
}