求助
查看原帖
求助
505959
YangJinxi_7_22楼主2023/12/22 17:24

哪位大佬能帮我看看为什么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;
}


2023/12/22 17:24
加载中...