写完P2365过来的,因为这里的Ti有负数,所以不满足决策单调性,那么就在凸包上二分即可。然后,全WA了?
我怀疑是不是二分写错了,于是拿这题的代码取交P2365却可以A掉。
不懂就问,蒟蒻求助。
#include <iostream>
#include <cstdio>
#define int long long
#define double long double
using namespace std;
const int N=300005;
int n,T,p1=1,p2=1;
int t[N],v[N],Q[N],f[N];
double X(int j) {return v[j];}
double Y(int j) {return f[j];}
double cal(int j1,int j2) {return (Y(j1)-Y(j2))/(X(j1)-X(j2));}
int binary(double v) {
int l=p1,r=p2;
while(l<r) {
int mid=l+r>>1;
if(cal(Q[mid],Q[mid+1])<=v) l=mid+1;
else r=mid;
}
return Q[r];
}
signed main()
{
freopen("tmp.in", "r", stdin);
cin>>n>>T;
for(int i=1;i<=n;i++) {
scanf("%lld%lld",&t[i],&v[i]);
t[i]+=t[i-1],v[i]+=v[i-1];
}
for(int i=1;i<=n;i++) {
int j=binary(t[i]+T);
f[i]=f[j]+t[i]*(v[i]-v[j])+T*(v[n]-v[j]);
while(p1<p2 && cal(Q[p2-1],Q[p2])>=cal(Q[p2-1],i)) p2--;
Q[++p2]=i;
}
cout<<f[n]<<endl;
return 0;
}