rt,样例过了,提交 0pts,实在看不出来了,跪求大佬捞捞QAQ
#include<iostream>
#define int long long
using namespace std;
const int N=300005;
int n,s,t[N],f[N],dp[N],que[N];
int Y(int i,int j){
return (dp[j]-s*f[j])-(dp[i]-s*f[i]);
}
int X(int i,int j){
return (f[j]-f[i]);
}
bool check(int x,int y){
return Y(que[x],que[x+1])>X(que[x],que[x+1])*y;
}
int Mid(int l,int r,int x){
int mid,an=-1;
while(l<r){
mid=(l+r)/2;
if(check(mid,x)) an=mid,r=mid-1;
else l=mid+1;
}
if(an==-1) return r;
return an;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>s;
for(int i=1;i<=n;i++){
cin>>t[i]>>f[i];
t[i]+=t[i-1],f[i]+=f[i-1];
}
int l=1,r=0;que[++r]=0;
for(int i=1;i<=n;i++){
int j=que[Mid(l,r,t[i])];
dp[i]=dp[j]+t[i]*(f[i]-f[j])+s*(f[n]-f[j]);
while(l<r&&Y(que[r],que[r-1])*X(i,que[r])>=
X(que[r],que[r-1])*Y(i,que[r])) r-=1;
que[++r]=i;
}
cout<<dp[n];
return 0;
}