萌新50分求助
查看原帖
萌新50分求助
200044
JS_TZ_ZHR楼主2020/10/2 21:02

RT

#include<bits/stdc++.h>
#define mininum -10000000000000000
#define int long long
using namespace std;
int n,d,k,x[1000005],s[1000005],total,l,r,mid,ans,f[100005];
struct node {
	int p,val;
};
deque<node>q;
bool check(int num) {
	int res=0,ri=0,Max=num+d,Min=max((long long)1,d-num);
	for(int i=1;i<=n;i++)f[i]=mininum;
	q.clear();
	q.push_front((node){
		0,0
	});
	for(int i=1; i<=n; i++) {
		if(x[i]<Min&&q.front().p==0)continue;
		while(!q.empty()&&x[i]-q.back().p>Max)q.pop_back();
		while(x[i]-x[ri+1]>=Min) {
			ri++;
			if(f[ri]==mininum||x[i]-x[ri]>Max)continue;
			while(!q.empty()&&f[ri]>=q.front().val)q.pop_front();
			q.push_front((node) {
				x[ri],f[ri]
			});
		}
		if(!q.empty())f[i]=s[i]+q.back().val;
		res=max(res,f[i]);
	}
	return (res>=k);
}
signed main() {
	freopen("1.in","r",stdin);
	scanf("%lld%lld%lld",&n,&d,&k);
	for(int i=1; i<=n; i++)
		scanf("%lld%lld",&x[i],&s[i]),total+=(s[i]>0?s[i]:0);
	if(total<k) {
		puts("-1");
		return 0;
	}
	l=0,r=2e9;
	while(r>=l) {
		mid=(l+r)>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	printf("%lld\n",ans);
}
2020/10/2 21:02
加载中...