社区讨论

单调队列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 条回复,欢迎继续交流。

正在加载回复...