求助单调队列
查看原帖
求助单调队列
127299
Young_Zn_Cu楼主2020/11/4 20:50
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+50;
int n,type,l,r,sum[N],q[N],pre[N],dp[N];
int x;
inline int read(){
	int cnt=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
	return cnt*f;
}
inline int val(int pos){return 2*sum[pos]-sum[pre[pos]];}
signed main(){
	n=read(),type=read();
	for(int i=1;i<=n;++i) x=read(),sum[i]=sum[i-1]+x;
	q[++r]=0;
	for(int i=1;i<=n;++i){
		while(l<r&&val(q[l+1])<=sum[i]) ++l;//这里写成while(l<r&&val(q[l])<=sum[i])然后l赋初值为1就连样例都过不了
		pre[i]=q[l];
		dp[i]=dp[pre[i]]+(sum[i]-sum[pre[i]])*(sum[i]-sum[pre[i]]);
		while(l<=r&&val(i)<=val(q[r]))--r;
		q[++r]=i;
	}
	cout<<dp[n]<<endl;
	return 0;
}
2020/11/4 20:50
加载中...