RT,以下代码需要开O2,否则会TLE10 #12,但在UOJ上可过。
求各位大佬帮萌新看看这份代码有什么问题QwQ
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N = 1e6+10;
ll read(){
ll num = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
num = (num << 3) + (num << 1) + (ch ^ 48);
ch = getchar();
}
return num * f;
}
ll n,k,a[N],s[N],f[N],la[N],fa[210][N],q[N],h,t;
ll X(ll A){return -s[A];}
ll Y(ll A){return la[A] - s[A] * s[A];}
double slope(ll A,ll B){return X(A) == X(B) ? -1e18 : 1.0 * (Y(A) - Y(B)) / (X(A) - X(B));}
int main(){
n = read();k = read();
for(ll i = 1 ; i <= n ; i ++)a[i] = read(),s[i] = s[i-1] + a[i];
for(ll L = 1 ; L <= k ; L ++){
h = 1,t = 1;q[1] = 0;
for(ll i = 1 ; i <= n ; i ++)la[i] = f[i];
for(ll i = 1 ; i <= n ; i ++){
while(h < t && slope(q[h+1],q[h]) <= s[i])h ++;
ll j = q[h];
fa[L][i] = j;
f[i] = la[j] + s[j] * (s[i] - s[j]);
while(h < t && slope(q[t],q[t-1]) >= slope(i,q[t]))t --;
q[++ t] = i;
}
}
printf("%lld\n",f[n]);
for(ll i = fa[k][n] ; k ; i = fa[--k][i])printf("%lld ",i);
return 0;
}