二分+DP+单调队列优化 40pts on #3、#6~#10求调
查看原帖
二分+DP+单调队列优化 40pts on #3、#6~#10求调
477821
toolong114514楼主2023/10/20 17:45
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define int long long
const int INF=0x7f7f7f7f7f7f7f7f;
const int N=5e5+10;
struct inpt{
	int x,s;
}v[N];
struct node{
	int val,pos;
};
deque<node> q;
int f[N];
int n,d,k,ans=-1;
bool check(int g){
	int tmp=-INF;
	q.clear();
	int lgest=g+d,shest=max(d-g,1ll);
	f[0]=0;
	int j=0;
	for(int i=1;i<=n;i++){
		f[i]=-INF;
		while(!q.empty()&&v[i].x-lgest>q.front().pos) q.pop_front();
		while(j<i&&v[i].x-shest>=v[j].x){
			if(f[j]==-INF){
				j++;
				continue;
			}
			while(!q.empty()&&f[j]>q.back().val) q.pop_back();
			q.push_back({f[j],v[j].x});
			f[i]=max(f[i],q.front().val+v[i].s);
			j++;
		}
		if(!q.empty()&&q.front().val!=-INF) f[i]=q.front().val+v[i].s;
		tmp=max(tmp,f[i]);
	}
	return tmp>=k;
}
signed main(){
	//freopen("P3957_6.in","r",stdin);
	ios::sync_with_stdio(false);
	cin>>n>>d>>k;
	for(int i=1;i<=n;i++){
		cin>>v[i].x>>v[i].s;
	}
	int l=0,r=N;
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid)){
			r=mid-1;
			ans=mid;
		}else{
			l=mid+1;
		}
	}
	cout<<ans;
	return 0;
}
2023/10/20 17:45
加载中...