50pts求条,悬关
查看原帖
50pts求条,悬关
629377
iamajcer楼主2024/10/12 21:47
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const long long INF=5e11;

int n, d, k, x[N], s[N], ans=0, L=0, R=0, hh=0, tt=0, q[N];
long long sum=0, f[N];
bool check(int p)
{
	int st=0, j=0;
	long long Max=0, Min=0;
	Min=max(1, d-p), Max=d+p;
	
	for (int i=1; i<=n; i++) f[i]=-INF;
	
	for (int i=1; i<=n; i++) 
		if (x[i]>=Min && x[i]<=Max)
		{
			st=i;
			break;
		} 
		
	if (st==0) return 0;
	
	f[st]=s[st], hh=1, tt=0, j=1;
	for (int i=st+1; i<=n; i++)
	{
		while (hh<=tt && x[q[hh]]+Max<x[i]) hh++;
		for (; j<=n && x[i]-x[j]>=Min; j++)
		{
			if (x[j]+Max<x[i]) continue;
			while (hh<=tt && f[q[tt]]<f[j]) tt--;
			q[++tt]=j;
		}
		
		f[i]=max(f[i], f[q[hh]]+s[i]);
	}
	for (int i=1; i<=n; i++) if (f[i]>=k) return 1;
	
	return 0;
}
int main()
{
	scanf("%d%d%d", &n, &d, &k);
	for (int i=1; i<=n; i++)
	{
		scanf("%d%d", &x[i], &s[i]);
		if (s[i]>0) sum+=s[i];
	}
	
	if (sum<k)
	{
		printf("-1");
		return 0;
	}
	
	
	for (int i=1; i<n; i++) L=min(L, x[i]-x[i-1]);
	R=1e9, L-=d; 
	while (L<=R)
	{
		int mid=(L+R)>>1;
		if (check(mid)) ans=mid, R=mid-1;
		else L=mid+1;
	}
	
	printf("%d", ans);
	return 0;
} 

rt,实在不知道问题出在哪了,WA了后5个点。

求助大佬!

2024/10/12 21:47
加载中...