WA 20pts/50pts求调
查看原帖
WA 20pts/50pts求调
539345
OrinLoong楼主2024/8/1 16:03
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN=5e5+5,MAXX=1e9+5;
const ll NINF=0xb0b0b0b0b0b0b0b0;
int N,D,K,X[MAXN],S[MAXN],L,R,qcnt;
ll dp[MAXN];
int Q[MAXN],P[MAXN],head,tail;
bool solve(int diff){
    ll ans=NINF;
    L=max(1,D-diff),R=min(X[N]+1,D+diff),qcnt=0;
    memset(dp,0xb0,sizeof(dp));
    dp[0]=0;
    //printf("L=%d,R=%d\n",L,R);
    head=1,tail=0;

    for(int i = 1;i <= N;i++){
        if(X[i]<L)continue;
        while(head<=tail&&Q[head]<X[i]-R)head++;
        while(X[qcnt]<=X[i]-L){
            while(head<=tail&&dp[P[head]]<=dp[qcnt])tail--;
            Q[++tail]=X[qcnt],P[tail]=qcnt;
            qcnt++;
        }
        
        //printf("Q:");
        //for(int j = head;j <= tail;j++)printf("(p:%d,q:%d)",P[j],Q[j]);
        //printf("\n");
        dp[i]=dp[P[head]]+S[i];
        //printf("dp[%d]=%d\n",i,dp[i]);
    }
    for(int i = 0;i <= N;i++)ans=max(ans,dp[i]);
    //printf("ans=%lld\n",ans);
    return ans>K;
}
int main(){
    //freopen("P3957_1.in","r",stdin);
    //freopen("myans.out","w",stdout);
    scanf("%d%d%d",&N,&D,&K);
    for(int i = 1;i <= N;i++)scanf("%d%d",&X[i],&S[i]);
    int l=0,r=X[N]+1,res=-1;
    while(l<=r){
        int mid=(l+r)>>1;
        //printf("mid=%d\n",mid);
        if(solve(mid))res=mid,r=mid-1;
        else l=mid+1;
    }
    printf("%d",res);
    return 0;
}
2024/8/1 16:03
加载中...