求助,这份代码需要开O2
查看原帖
求助,这份代码需要开O2
141368
May_wind楼主2021/9/13 18:16

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;
} 
2021/9/13 18:16
加载中...