90pts 求助
查看原帖
90pts 求助
876571
lsyfather楼主2024/5/21 12:05
#include<bits/stdc++.h>
using namespace std;
int n,d,k;
struct node{
	int dis;
	int v;
}m[1000005];
int x,y,flag=0;
deque <int> q;
int f[1000005];
int check(int g){
	int left=max(1,d-g);
	int right=d+g;
	f[0]=0;
	for(int i=1;i<=n;i++){
		f[i]=-1e9;
	}
	while(!q.empty()) q.pop_back();
	int point=0;
	for(int i=1;i<=n;i++){
		while(m[i].dis-m[point].dis>=left)
		{	if(q.empty()){
				q.push_back(point);
				point++;
				continue;
			}
			while(!q.empty()&&f[q.back()]<=f[point]){
				q.pop_back();	
			}
			q.push_back(point);
			point++;
		}
	 	 
		if(!q.empty()){
			while(m[q.front()].dis+right<m[i].dis||m[q.front()].dis+left>m[i].dis){
				q.pop_front();	
				if(q.empty()) break;
			}
		}
		if(q.empty()) f[i]=-1e9;
		else f[i]=max(m[i].v+f[q.front()],f[i]);
	   	if(f[i]>k){ flag=1;return 1;}
	}
  	return 0;
}
int main(){
	cin>>n>>d>>k;
	for(int i=1;i<=n;i++){
		cin>>x>>y;
		m[i].v=y;
		m[i].dis=x;
	}
	int l=0,r=m[n].dis,mid;
	while(l<r){
		mid=(l+r)/2;
		 
		if(check(mid)){
			r=mid;
		}else{
			l=mid+1;
		}
		
	}
	if(flag) cout<<l;
	else cout<<"-1"<<endl;
	
} 
2024/5/21 12:05
加载中...