大佬求条

#include<bits/stdc++.h>
using namespace std;
#define maxn 300100
#define int long long
int q[maxn*2],l=maxn-100,r=maxn-100;
int n,s,t[maxn],f[maxn],dp[maxn],pret[maxn],pref[maxn];
signed main(){
	
	cin>>n;
	cin>>s;
	for(int i=1;i<=n;i++){
		cin>>t[i]>>f[i];
	}
	for(int i=1;i<=n;i++){
		pret[i]=pret[i-1]+t[i];
		pref[i]=pref[i-1]+f[i];
	}
	q[--l]=0;
	q[++r]=1;
	dp[0]=0;
	dp[1]=s*pref[n]+t[1]*f[1];
	
	for(int i=2;i<=n;i++){
		int kn=(s+pret[i]);
		int ln=l,rn=r;
		while(ln<rn){
			int mid=(ln+rn)/2;
			if((__int128)((dp[q[mid+1]]-dp[q[mid]]))<=(__int128)(kn*pref[q[mid+1]]-pref[q[mid]])){
				ln=mid+1;
			}
			else{
				rn=mid;
			}
		}
		int jn=q[ln];
		dp[i]=dp[jn]+pret[i]*(pref[i]-pref[jn])+(pref[n]-pref[jn])*s;
		
		while(r-l+1>1&&(__int128)((dp[i]-dp[q[r]])*(pref[q[r]]-pref[q[r-1]]))<=(__int128)((pref[i]-pref[q[r]])*(dp[q[r]]-dp[q[r-1]])))r--;
		q[++r]=i;
	}
	cout<<dp[n];
	return 0;
}
posted @ 2026-07-24 15:39  Pap_han  阅读(8)  评论(3)    收藏  举报