Q_Q,小萌新求助。
查看原帖
Q_Q,小萌新求助。
389111
_Ask_楼主2021/10/17 18:55

交上去报蛋,但是手测是对的...

#include<bits/stdc++.h>
using namespace std;
long long n,i,l,r,d,k,w[500010],s[500010],q[500010],f[500010],mid;
long long ans;

void clean(long long a,long long b){
	long long i;
	for(i=a;i<=b;i++){
		q[i]=0;
	}
}

long long max(long long x,long long y){
	if(x>y)return x;
	else return y;
}

bool check(long long x){
	int head=1,tail=1,i;
	q[1]=0;
	for(i=1;i<=n;i++){
		while(head<=tail&&w[i]-w[q[head]]>d+x){
			q[head++]=0;
		}
		if(head>tail)return 1;
		if(w[i]-w[q[head]]>=max(1,d-x))f[i]=f[q[head]]+s[i];
		else continue;
		if(f[i]>=k){
//			cout<<f[i]<<endl;
			clean(head,tail);
		    return 0;
		}
		q[++tail]=i;
		while(f[q[tail]]>=f[q[tail-1]]&&tail>head){
			q[tail-1]=q[tail--];
		}
//		cout<<f[i]<<' '<<d+x<<' '<<max(1,d-x)<<' '<<q<<endl;
	}
	clean(head,tail);
	return 1;
}

int main(){
//	freopen("jump.in","r",stdin);
//	freopen("jump.out","w",stdout);
	scanf("%lld%lld%lld",&n,&d,&k);
	for(i=1;i<=n;i++){
		scanf("%lld%lld",&w[i],&s[i]);
	}
//	l=r=99;
	l=0;r=max(d,w[n]);ans=-1;
//	cout<<l<<' '<<r<<endl;
	while(l<=r){
		mid=(l+r)/2;
//		if(mid==101)mid=1;
//		cout<<endl<<mid<<endl;
		if(check(mid))l=mid+1;
		else{
//		    cout<<mid<<endl;
		    ans=mid;
		    r=mid-1;
		}
	}
	printf("%lld",ans);
	return 0;
}
2021/10/17 18:55
加载中...