60pts wa on 1,2,4,9玄关求调
查看原帖
60pts wa on 1,2,4,9玄关求调
572286
feng_zi_xuan楼主2024/12/25 17:09
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,d,k,s[1000010],x[1000010],deq[1000010],f[1000010],sum;
int read()
{
	int zchissuperboy;
	scanf("%lld",&zchissuperboy);
	return zchissuperboy;
}
int check(int g)
{
	int ll=1,rr=0,minp=max(1ll,d-g),maxp=d+g,now=0;
	memset(f,0,sizeof f);
	for(int i=1;i<=n;i++)
	{
		while(s[i]-s[now]>=minp&&now<i)
		{
			if(ll<=rr)
			{
				while(ll<=rr&&f[now]>=f[deq[rr]])
	    			rr--;
			}
			deq[++rr]=now;
			now++;
		}
    	while(ll<=rr&&s[i]-s[deq[ll]]>maxp)
    		ll++;
    	if(ll<=rr) f[i]=f[deq[ll]]+x[i];
    	else f[i]=-1e18;
    	if(f[i]>=k) return 1;
	}
	return 0;
}
signed main()
{
	cin>>n>>d>>k;
	for(int i=1;i<=n;i++)
		s[i]=read(),x[i]=read(),sum+=max(0ll,x[i]);
	if(sum<k)
	{
		cout<<-1<<endl;
		return 0;
	}
	int l=0,r=1e9;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		if(check(mid)) r=mid;
		else l=mid+1;
		//cout<<l<<' '<<r<<endl;
	}
	cout<<r<<endl;
	
	return 0;
}
2024/12/25 17:09
加载中...