求助基础二分
查看原帖
求助基础二分
315205
Kniqht楼主2023/10/25 21:15

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;
}
2023/10/25 21:15
加载中...