晶石厚任,如果你WA on #9
查看原帖
晶石厚任,如果你WA on #9
766436
Mr_RedStone楼主2024/12/21 14:59

如果你没有写等于号......

#include<bits/stdc++.h>
using namespace std;
int n,k,m;
int a[500005],d[500005];
long long f[500005];
bool check(int x){
	memset(f,-0x3f,sizeof(f));
	int l,r;
	if(x<k) l=k-x,r=k+x;
	else l=1,r=k+x;
	f[0]=0;
	deque<int> q;
	int cur=0;
	q.push_back(0);
	for(int i=1;i<=n;i++){
		if(d[i]<l) continue;
		while(!q.empty()&&d[q.front()]+r<d[i]) q.pop_front();
		while(d[cur]+r<d[i]) cur++; 
		while(d[cur]+l<=d[i]&&cur<i){//here
			while(!q.empty()&&f[q.back()]<=f[cur]) q.pop_back();
			q.push_back(cur);
			cur++;
		}
		if(!q.empty()) f[i]=f[q.front()]+a[i];
	}
//	printf("%d\n",x);
//	for(int i=1;i<=n;i++){
//		printf("%d ",f[i]); 
//	}
//	printf("\n");
	return *max_element(f,f+n+1)>=m;
} 
int main(){
	scanf("%d %d %d",&n,&k,&m);
	for(int i=1;i<=n;i++){
		scanf("%d %d",&d[i],&a[i]);
	}
	int l=0,r=1e9,ans=0;
	bool flag=0;
	while(l<=r){
		int x=(l+r)>>1;
		if(check(x)){
			r=x-1;
			ans=x;
			flag=1;
		} 
		else{
			l=x+1;
		}
	}
	if(!flag) ans=-1;
	printf("%d",ans);
	return 0;
}
//10 59 112
//41 27
//89 -50
//112 -4
//144 -45
//187 42
//196 35
//237 8
//262 2
//269 -8
//273 -37
2024/12/21 14:59
加载中...