WA求调
查看原帖
WA求调
609565
OtterZ楼主2023/3/16 11:26
#include<cstdio>
#include<queue>
#include<algorithm>
#include<iostream>
#define int long long
using namespace std;
int n,m,t,s[1000009],dp[1000009],cnt[1000009],maxt,as,bs,cs;
inline int k(int i){
	return -2ll*as*s[i];
}
inline int b(int i){
	return dp[i]+s[i]*s[i]*as+cs-bs*s[i];
}
inline int x(int i){
	return s[i];
}
inline int dp_add(int i){
	return as*s[i]*s[i]+bs*s[i];
}
inline bool cmpadd(int l1,int l2,int l3){
	return abs(b(l1)-b(l2))*abs(k(l2)-k(l3))>=abs(b(l2)-b(l3))*abs(k(l1)-k(l2));
}
inline bool cmpkill(int l1,int l2,int kill_time){
	return abs(b(l2)-b(l1))<=kill_time*abs(k(l2)-k(l1));
}
signed main(){
    int tp;
    scanf("%lld",&tp);
    while(tp--){
	    scanf("%lld%lld%lld%lld",&n,&as,&bs,&cs);
	    for(int i=1;i<=n;i++){
	    	scanf("%lld",&cnt[i]);
	    	s[i]=s[i-1]+cnt[i];
	    }
	    deque<int>q;
	    dp[0]=0;
	    for(int i=1;i<=n;i++){
	    	if(!(q.size()>0&&k(q.back())==k(i-1)&&b(q.back())>=b(i-1))){
	    		if((q.size()>0&&k(q.back())==k(i-1)))q.pop_back();
	    		while(q.size()>=2){
	    			int a=q.back();
	    			q.pop_back();
	    			int b=q.back();
	    			if(!cmpadd(b,a,i-1)){
	    				q.push_back(a);
	    				break;
	    			}
	    		}
	    		q.push_back(i-1);
	    	}
	    	while(q.size()>=2){
	    		int a=q.front();
	    		q.pop_front();
	    		int b=q.front();
	    		if(!cmpkill(a,b,x(i))){
	    			q.push_front(a);
	    			break;
	    		}
	    	}
	    	int a=q.front();
	    	dp[i]=k(a)*x(i)+b(a)+dp_add(i);
	    }
	    cout<<dp[n]<<endl;
    }
	return 0;
}
2023/3/16 11:26
加载中...