20分求助 8WA
查看原帖
20分求助 8WA
560036
Siven楼主2023/1/10 17:04
#include<bits/stdc++.h>
using namespace std;
int n,d,k,q[500005],head=1,tail,maxs;
long long dp[500005];
struct oo
{
	int s;
	long long fs;
}a[500005];
bool check(int o)
{
	int l=max(d-o,1),r=d+o,pre=0;
	long long ret=0;
	memset(dp,128,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i].s<l) continue;
		while((a[i].s-a[q[head]].s>r||a[i].s-a[q[head]].s<l) && head<=tail) head++;
		while(a[i].s-a[pre].s>=l&&pre<i) 
		{
			while(a[q[tail]].fs<=dp[pre] && head<=tail) tail--;
			q[++tail]=pre;
			pre++;
		}
		dp[i]=dp[q[head]]+a[i].fs;
		ret=max(ret,dp[i]);
		if(ret>=k) return 1;
	}
	return 0;
}
int main()
{
	scanf("%d%d%d",&n,&d,&k);
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%lld",&a[i].s,&a[i].fs);
		maxs=max(a[i].s,maxs);
		sum+=max(a[i].fs,(long long)0);
	}
	if(sum<k)
	{
		printf("-1");
		return 0;
	}
	int l=0,r=max(maxs,d);
	while(l<r)
	{
		head=1,tail=0;
		memset(q,0,sizeof(q));
		int mid=(l+r)>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	printf("%d",r);
	return 0;
}
2023/1/10 17:04
加载中...