建议降橙
查看原帖
建议降橙
755251
adidde楼主2023/6/9 16:03

这道题并不需要单调队列去优化,也可以不用令r==1005,稍微优化一下二分就可以了

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 500005;
const int INF = -0x3f3f3f3f;
typedef long long ll;
ll n,d,k;
ll a[maxn],b[maxn];
ll f[maxn];
ll dp[maxn];
ll low_x,high_x;


bool _find2(ll x){
	low_x = 1;
	high_x = d+x;
	if(x<d){
		low_x = d-x;
	}	
	memset(dp,INF,sizeof(dp));
	dp[0] = 0;
	for(int i = 1;i<=n;i++){
		for(int j = i-1;j>=0;j--){
			if(low_x>(a[i]-a[j]))
				continue;
			if((a[i]-a[j])>high_x)
				break;
			dp[i] = max(dp[i],dp[j]+b[i]);
			if(dp[i]>=k){
				return 1;
			}
		}
	}
	return 0;
}

int main(){
	scanf("%lld%lld%lld",&n,&d,&k);
	ll mxxx = 0;
	for(int i = 1;i<=n;i++){
		scanf("%lld%lld",&a[i],&b[i]);
		mxxx = max(mxxx,a[i]-a[i-1]);
	}
	ll l = 1,r = a[n];
	if(d==1)
		r = mxxx;
	if(d>=1000)
		r = mxxx;
	ll m = 0;
	ll mid;
	while(l<=r){
		mid = l + (r-l)/2;
		if(_find2(mid)){
			m = mid;
			r = mid-1;
		}else
			l = mid+1;
	}
	printf("%lld",m);
	return 0;
}
2023/6/9 16:03
加载中...