80pts求助 WA9和10
查看原帖
80pts求助 WA9和10
518995
GUMIfans0626楼主2024/8/22 16:37
#include<bits/stdc++.h>
using namespace std;
long long n,d,k;
const int MAXN=500005;
long long x[MAXN],s[MAXN];
long long dp[MAXN];
bool check(int g){
	//cout<<n<<endl;
	long long l=max((long long)1,d-g),r=d+g,R=-1;
	deque<long long> que;
	memset(dp,0,sizeof dp);
	for(int i=1;i<=n;i++){
		if(x[i-1]+r<x[i]) break;
		while(R+1<i && x[R+1]+l<=x[i]){
			while(!que.empty() && dp[que.back()]<dp[R+1]) que.pop_back();
			R++;
			que.push_back(R);
		}
		while(!que.empty() && x[i]>x[que.front()]+r) que.pop_front();
		if(!que.empty()) dp[i]=dp[que.front()]+s[i];
		if(dp[i]>=k) return 1;
		//cout<<dp[i]<<" ";
	}
	return 0;
}
int main(){
	scanf("%lld%lld%lld",&n,&d,&k);
	long long tot=0;
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&x[i],&s[i]);
		if(s[i]>=0) tot+=s[i];
	}
	if(tot<k){
		cout<<-1;
		return 0;
	}
	int left=0,right=1e9;
	while(left<right){
		int mid=(left+right)>>1;
		if(check(mid)){
			right=mid;
		}else{
			left=mid+1;
		}
	}
	cout<<left;
	return 0;
}

https://www.luogu.com.cn/record/174183705

2024/8/22 16:37
加载中...