rt,只过了三个点,其他都 WA 了,蒟蒻看不出问题。样例已过。
斜率优化 DP + 二分。
#include<bits/stdc++.h>
// #define LOCAL
#define int ll
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
using namespace std;
typedef long long ll;
typedef long double ld;
const int N=3e5+5;
int n,s;
int t[N],f[N];
int T[N],g[N];
int dp[N];
struct node{
int x,y;
};
ld cal(node a,node b){
return 1.0*(b.y-a.y)/(b.x-a.x);
}
int l,r;
node que[N];
int que_up_bound(int l,int r,ld k){
int ans=-1,R=r;
r--;
while(l<=r){
int mid=(l+r)>>1;
if(k<cal(que[mid],que[mid+1])) r=mid-1,ans=mid;
else l=mid+1;
}
if(ans==-1) return R;
// if(k<cal(que[l],que[l+1])) return l+1;
return ans;
}
signed main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
sf("%lld%lld",&n,&s);
rep(i,1,n) {
sf("%lld%lld",&t[i],&f[i]);
T[i]=t[i]+T[i-1];
g[i]=f[i]+g[i-1];
}
l=r=1;
que[1]={0,0};
rep(i,1,n){
ld k=T[i];
int mid=que_up_bound(l,r,k);
int b=que[mid].y-k*que[mid].x;
dp[i]=b+T[i]*g[i]+s*g[n];
int x=g[i],y=dp[i]-s*g[i];
while(l<r&&cal({x,y},que[r])<=cal(que[r-1],que[r])) r--;
que[++r]={x,y};
}
pf("%lld\n",dp[n]);
}