过不了样例!!!
查看原帖
过不了样例!!!
86624
洛谷Onlinejudge楼主2020/8/14 16:28

code:

#include "bits/stdc++.h"
using namespace std;
#define Long long long int
#define MAXN 50500

const Long INF=99999999999999;
Long Sum[MAXN],F[MAXN],L,N;
inline Long Sq(Long X){
	return (X*X);
}

inline Long X(int j){
	Long Num=(Sum[j-1]+j);
	return Num;
}

inline Long Y(int j){
	Long Num=Sq(Sum[j-1]+j)+F[j-1];
	return Num;
}

inline Long K(int i){
	Long Num=2*(Sum[i]+i-L);
	return Num;
}

int H,T,Q[MAXN];
inline Long FacX(int i,int j){
	Long Num=(X(i)-X(j));
	return Num;
}

inline Long FacY(int i,int j){
	Long Num=(Y(i)-Y(j));
	return Num;
}

int main(void){
	cin>>N>>L;
	for(register int i=1;i<=N;i++)
		cin>>Sum[i];
	for(register int i=1;i<=N;i++)
		Sum[i]+=Sum[i-1],F[i]=INF;
	F[0]=0;
	H=T=1,Q[1]=1;
	for(register int i=1;i<=N;i++){
		while(H<T&&FacY(Q[H+1],Q[H])<=FacX(Q[H+1],Q[H])*K(i))
			H++;
		register int j=Q[H];
		F[i]=min(F[i],F[j-1]+Sq(i-j+Sum[i]-Sum[j-1]-L));
		while(H<T&&FacX(Q[T],Q[T-1])*FacY(i,Q[T])<=FacX(i,Q[T])*FacY(Q[T],Q[T-1]))
			T--;
		Q[++T]=i;
	}
	cout<<F[N]<<endl;
	return 0;
}
2020/8/14 16:28
加载中...