已A,但有问题
查看原帖
已A,但有问题
280999
_fairytale_楼主2023/9/30 20:00
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define re register
#define int long long
#define maxn 500010
using namespace std;
int n,d,k;
int ans=-1;
int x[maxn],s[maxn];
int f[maxn];
int q[maxn];
inline bool dp(int g) {
	memset(f,-0x3f,sizeof f);
	int head=1,tail=0,mx=-1,cur=0;
	q[1]=0,f[0]=0;
	for(re int i=1;i<=n;++i) {
		int l=x[i]-d-g,r=min(x[i]+g-d,x[i]-1);	
		while(x[cur]<=r) {
			while(head<=tail&&f[q[tail]]<=f[cur])--tail;
			if(f[cur]!=-inf)q[++tail]=cur;
			++cur;
		}
		while(head<=tail&&x[q[head]]<l)++head;
		if(head<=tail)f[i]=f[q[head]]+s[i];
		mx=max(mx,f[i]);
		if(mx>=k)return true;
	}
	return false;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>d>>k;
	for(re int i=1; i<=n; ++i) {
		cin>>x[i]>>s[i];
	}
	int l=0,r=1000000000;
	while(l<=r) {
		int g=(l+r)>>1;
		if(dp(g)) {
			ans=g;
			r=g-1;
		} else l=g+1;
	}
	cout<<ans;
	return 0;
}

为什么单调队列不能先弹出队头啊

即24行为什么不能提到19行前面

2023/9/30 20:00
加载中...