哪位大佬能帮我看看为什么60 62 67这三个点TLE?
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e5+5;
typedef long long ll;
int n, k;
ll a[N], s[N];
ll f[N][205];
int g[N][205];
int q[N], head, tail;
ll Y(int i, int k){
return s[i]*s[i]-f[i][k-1];
}
ll X(int i){
return s[i];
}
ll K(int i){
return s[i];
}
ll b(int i, int k){
return f[i][k];
}
ll slope_up(int i, int j, int k){
return Y(i, k)-Y(j, k);
}
ll slope_down(int i, int j){
return X(i)-X(j);
}
void print(int i,int j) {
if(j!=1)
print(g[i][j],j-1);
//cout << g[i][j] <<" ";
printf("%d ", g[i][j]);
}
int main( ) {
//cin >> n >> k;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++){
//cin >> a[i];
scanf("%lld", a+i);
s[i] = s[i-1] + a[i];
}
head = tail = 1;
q[head] = 0;
for(int l = 1; l <= k; l++){
head = tail = 1;
q[head] = 0;
for(int i = 1; i <= n; i++){
while( head < tail &&
slope_up(q[head+1],q[head],l) <= K(i)*slope_down(q[head+1], q[head])) ++head;
int j = q[head];
f[i][l] = f[j][l-1] + (s[j])*(s[i]-s[j]);
g[i][l] = j;
while( head < tail &&
slope_up(i,q[tail],l)*slope_down(q[tail],q[tail-1]) <= slope_up(q[tail],q[tail-1],l)*slope_down(i,q[tail])) --tail;
q[++tail] = i;
}
}
//cout << f[n][k] <<endl;
printf("%lld\n", f[n][k]);
print(n,k);
return 0;
}