社区讨论
单调队列50分求条
P3957[NOIP 2017 普及组] 跳房子参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2v599
- 此快照首次捕获于
- 2025/11/03 19:49 4 个月前
- 此快照最后确认于
- 2025/11/03 19:49 4 个月前
AC AC WA WA WA AC AC AC WA WA
康怡康CODE
CPP#include<bits/stdc++.h>
using namespace std;
int n,d,k;
int a[500009],b[500009];
int q[500009]={0},F=0,r=0;
int f[500009]={0};
bool check(int g)
{
F=r=0;int ok=1;
memset(q,0,sizeof q);
memset(f,0,sizeof f);
for(int i=1;i<=n;i++)
{
///insert f[i-1]
if(ok)
{
while(F<r && f[q[r]]<=f[i-1])r--;
q[++r]=i-1;
}
///delete a[i]-a[x]<L
int L=max(1,d-g),R=d+g;
while(F<r && a[i]-a[q[F+1]]>R)F++;
///calculate f[i]
if(F<r && a[i]-a[q[F+1]]>=L)f[i]=f[q[F+1]]+b[i],ok=1;
else ok=0;
///cout<<(a[i]>=L)<<" "<< (a[i]<=R) <<" "<<a[i]<<" "<<q[F+1]<<" "<<endl;
}
///printf("*%d\n",f[3]);
int mx=*max_element(f+1,f+n+1);
return mx>=k;
}
int main()
{
cin>>n>>d>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
int l=0,r=a[n];
while(l<r)
{
int mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid+1;
}
if(check(l))cout<<l;
else cout<<-1;
}
就是这段,Record
求条
回复
共 1 条回复,欢迎继续交流。
正在加载回复...