90pts求助,以关注做回报
查看原帖
90pts求助,以关注做回报
366470
hc_awa楼主2021/5/2 21:50

最后一个点WA

#include <deque>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
typedef long long ll;
#define int ll
using namespace std;
const int inf=0x3f3f3f3f;
const int N=5e5+7;
int x[N],s[N],f[N],q[N];
int n,d,k;
inline bool check(int p) {
	int now=0;
	memset(f,0,sizeof(f));
	int head=1,tail=0;
	int lg=max(1,d-p),rg=d+p;
	for(int i=1;i<=n;++i) {
		while(x[now]+lg<=x[i]) {
			while(head<=tail && f[q[tail]]<f[now])
				--tail;
			q[++tail]=now++;
		}
		while(head<=tail && x[q[head]]+rg<x[i])
			++head;
		if(head<=tail)
			f[i]=f[q[head]]+s[i];
		else
			f[i]=-inf;
		if(f[i]>=k)
			return true;
	}
	return false;
}
signed main() {
	scanf("%lld%lld%lld",&n,&d,&k);
	for(int i=1;i<=n;++i)
		scanf("%lld%lld",x+i,s+i);
	int l=1,r=x[n],mid;
	while(l<r) {
		mid=(l+r)>>1;
		if(check(mid))
			r=mid;
		else
			l=mid+1;
	}
	printf("%lld",check(l)?l:-1);
    return 0;
}

2021/5/2 21:50
加载中...