TLE on #23,24,25 求调
查看原帖
TLE on #23,24,25 求调
556975
PNNNN楼主2025/6/26 07:50
#include<bits/stdc++.h>
#define ll long long
#define fr first
#define sc second
#define lowbit(x) x&-x;
#define ls k<<1
#define rs k<<1|1
using namespace std;

const ll mod=1ll<<30;

const __int128 inf=(__int128)1<<120;

int n;

ll a[4000005],sum[4000005];

pair <__int128,ll> dp[4000005];

inline __int128 pw(ll x){
	return (__int128)x*x;
}

vector <int> vec[4000005];

priority_queue <int> q;

inline int read(){
	register int x=0,t=0;
	static char ch=getchar();
	while(!isdigit(ch)) t|=(ch=='-'),ch=getchar();
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return t?-x:x;
}

inline void write(__int128 x){
	if(x>=10)write(x/10);
	putchar('0'+x%10);return;
}

signed main(){
	
	n=read(),read();
	for(int i=1;i<=n;i++){
		a[i]=read(),sum[i]=sum[i-1]+a[i];
		dp[i]={inf,0};
	}
	q.push(0);
	for(int i=1;i<=n;i++){
		
//		for(int j=i;j>=1;j--){
//			if(sum[i]-sum[j-1]>=dp[j-1].sc){
//				dp[i]={dp[j-1].fr+pw(sum[i]-sum[j-1]),sum[i]-sum[j-1]};
//				break;
//			}
//		}
			
		for(int j:vec[i]){
			q.push(j);
		}
		
		int j=q.top();
		dp[i]={dp[j].fr+pw(sum[i]-sum[j]),sum[i]-sum[j]};
		
		int l=i,r=n,res=0;
		while(l<=r){
			int mid=l+r>>1;
			if(sum[mid]>=dp[i].sc+sum[i]){
				r=mid-1,res=mid;
			}else l=mid+1;
		}
		if(res)vec[res].push_back(i);
		
	}
	write(dp[n].fr);
	
	return 0;
}
2025/6/26 07:50
加载中...