社区讨论

求助此题

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo8d9kz6
此快照首次捕获于
2023/10/27 16:43
2 年前
此快照最后确认于
2023/10/27 16:43
2 年前
查看原帖
CPP
#include<iostream>
#include<climits>
using namespace std;

int n,d,k,ans=-1;
const int MAXN=500010;
const long long INF=20000000000000;
struct p{
    int v,s;
}a[MAXN];

long long f[100],head,tail,q[100];
bool OK(int g){
    int l=max(d-g,1),r=d+g;
    for(int i=1;i<=n;i++)f[i]=-INF;
    f[0]=0;
    head=tail=0;
    int now=0;
    for(int i=1;i<=n;i++){
        while(now<i&&a[i].v-a[now].v>=l){
            while(head<tail&&f[now]>=f[q[tail]])tail--;
                q[++tail]=now;
            now++;
        }
        while(head<tail&&a[i].v-a[q[head+1]].v>r){
            if(head<=tail)f[i]=f[q[head+1]]+a[i].s;
            if(f[i]>=k)return true;
        }
    }

    return false;
}

int main(){
    cin>>n>>d>>k;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].v,&a[i].s);
    int l=0,r=max(a[n].v,d);
    int mid;
    while(l<=r){
        mid=(l+r)/2;
        if(OK(mid)){
            ans=mid;
            r=mid-1;
        }
        else
            l=mid+1;
    }

    cout<<ans<<endl;

    return 0;
}

回复

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

正在加载回复...