悬关求调
查看原帖
悬关求调
752711
hateful_bug楼主2024/7/17 19:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000005;
int n,d,k,x[N],v[N],L,R=2001,mid,f[N],q[N];
bool pd()
{
	int l=1,r=0,j=0,zx=max(1ll,d-mid),zd=d+mid;
	memset(f,-0x7f7f7f7f,sizeof(f));
	f[0]=0;
	for(int i=1;i<=n;i++)
	{
		while(x[j]+zd<x[i]) ++j;
		while(j<i&&x[q[j]]+zd>=x[i]&&x[j]+zx<=x[i])
		{
			while(l<=r&&v[q[r]]<=v[j]||x[q[r]]+zd<x[j]) --r;
			q[++r]=j;
			++j;
		}
		while(l<=r&&x[q[l]]+zd<x[i]) ++l;
		if(l<=r)
		f[i]=f[q[l]]+v[i];
		if(f[i]>=k)
		return true;
	}
	return false;
}
signed main()
{
//	freopen("P3957_2.in","r",stdin);
	scanf("%lld%lld%lld",&n,&d,&k);
	for(int i=1;i<=n;i++)
	scanf("%lld%lld",&x[i],&v[i]);
	while(L<R)
	{
		mid=(L+R)>>1;
		if(pd())
		R=mid;
		else
		L=mid+1;
	}
	if(L==2001)
	printf("-1");
	else
	printf("%lld",L);
	return 0;
}//qwq
2024/7/17 19:16
加载中...