社区讨论

90分??求大佬救

P3957[NOIP 2017 普及组] 跳房子参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6wq6v0
此快照首次捕获于
2025/11/20 12:04
4 个月前
此快照最后确认于
2025/11/20 12:04
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>

typedef long long ll;

using namespace std;

int a[500001],s[500001],q[500001];
ll v[500001];
int main(){
	int n,d,k;
	ll sum=0;
	scanf("%d%d%d",&n,&d,&k);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&s[i],&a[i]);
		if(a[i]>0){
			sum+=a[i];
		}
	}
	if(sum<k){
		printf("-1");
		return 0;
	}
	v[0]=0;

	int l=0,r=s[n]-d;
	while(l+1<r){
		int m=(l+r)/2;
		ll maxvz=0;
		int inn=0;
		int h=0,t=0;
		memset(v,0,sizeof(v));
		for(int i=1;i<=n;i++){
			while(inn<i&&s[i]-s[inn]>=d-m){
				if(h==t){
					q[t]=inn;
					t++;
				}
				else{
					while(h<t&&v[inn]>=v[q[t-1]]){
						t--;
					}
					q[t]=inn;
					t++;
				}
				inn++;
			}
			while(h<t&&s[i]-s[q[h]]>d+m){
				h++;
			}
			if(h<t){
				v[i]=a[i]+v[q[h]];
			}
			else{
				v[i]=-1926081792;
			}
			maxvz=max(v[i],maxvz);
		}
		if(maxvz>=k){
			r=m;
		}
		else{
			l=m;
		}
	}
	printf("%d",r);
}

回复

1 条回复,欢迎继续交流。

正在加载回复...