rt,斜率优化加个二分就不会了/kk
看题解好像跟我写的不太一样。。
我的这个滞涨二分是这样的:
等于二分的是一个线段的右端,斜率是它和它左边点的斜率。然后若这个斜率小于等于k,那么它自身可以,也有可能在右边。
感觉没问题啊,tj似乎是枚举左端点,然后L,R跟我的更新反过来
斜率优化咋这么多玄学bug。。。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,s,q[N],f[N];
int w[N],t[N];
int Y(int i){
return f[i];
}
int K(int i){
return s+t[i];
}
int X(int i){
return w[i];
}
int hh,tt;
bool check(int i,int T){
if(i==hh) return 1;
if((Y(i)-Y(i-1))<=K(T)*(X(i)-X(i-1))) return 1;
return 0;
}
signed main(){
scanf("%lld%lld",&n,&s);
for(int i=1;i<=n;i++) scanf("%lld%lld",&t[i],&w[i]),t[i]+=t[i-1],w[i]+=w[i-1];
for(int i=1;i<=n;i++){
int L=hh,R=tt,ans;
while(L<=R){
int mid=L+R>>1;
if(check(mid,i)) L=mid+1,ans=mid;
else R=mid-1;
}
int j=q[ans];
f[i]=f[j]+t[i]*(w[i]-w[j])+s*(w[n]-w[j]);
while(hh<tt&&(Y(q[tt])-Y(q[tt-1]))*(X(i)-X(q[tt]))>=(Y(i)-Y(q[tt]))*(X(q[tt])-X(q[tt-1]))) tt--;
q[++tt]=i;
}
printf("%lld",f[n]);
return 0;
}