社区讨论
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 条回复,欢迎继续交流。
正在加载回复...