单调队列WA*2,求debug qwq

P1725 琪露诺

无钩七不改名 @ 2022-12-10 12:25:20

RT.

提交记录:https://www.luogu.com.cn/record/96970264

代码:

#include<bits/stdc++.h>
using namespace std;

int n,l,r;
long long a[200005],dp[400005],ans,f[400005];

int main(){
    scanf("%d%d%d",&n,&l,&r);
    for(int i=0;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    int dl=1,dr=1;
    ans=-(1<<30);
    for(int i=0;i<=n+r;i++)dp[i]=-(1<<30);
    dp[0]=a[0];
    f[1]=0;
    for(int i=l;i<=n+r;i++){
        //dp[i]=-(1<<30);
        while(dl<=dr&&i-r>f[dl])dl++;
        while(dl<=dr&&dp[f[dr]]<=dp[i-l])dr--;
        f[++dr]=i-l;
        if(dl<=dr)dp[i]=dp[f[dl]]+a[i];
        //if(dp[i]!=-(1<<30))f[++dr]=i;
        //cout<<i<<" "<<f[dl]<<" "<<dp[i]<<endl;
    }
    for(int i=n+1;i<=n+r;i++)ans=max(ans,dp[i]);
    printf("%lld",ans);
    return 0;
}

by hanjinghao @ 2022-12-10 13:18:31

@血殷阁_北慕汐 是数组越界了吧。你后面的 f dp 开了两倍大小了,但是 a 数组没有开两倍大小。你在 for 循环 1 n + r 这一段里面访问 a_i 有可能越界。


by 无钩七不改名 @ 2022-12-10 19:37:20

@hanjinghao 噢噢噢过了thx


by 无钩七不改名 @ 2022-12-10 19:38:26

话说数组越界为什么是WA不是RE啊()


by hanjinghao @ 2022-12-10 19:39:11

@血殷阁_北慕汐 数组越界是 UB,不同的编译器可以做出不同的反应。WA、RE、TLE、MLE 甚至 AC 都是有可能的。


by hanjinghao @ 2022-12-10 19:40:11

@血殷阁_北慕汐 通常 Linux 比 Windows 对数组越界这种问题更敏感。


by 无钩七不改名 @ 2022-12-10 19:40:40

噢噢噢thx


by hanjinghao @ 2022-12-10 19:41:19

@血殷阁_北慕汐 我之前有一次写组合数的时候,数组下标访问到负数了,不开 O2 没出错,开 O2 就寄了。


by 无钩七不改名 @ 2022-12-10 19:41:28

我一直以为越界就是RE(大雾


by hanjinghao @ 2022-12-10 19:42:17

我是一直到高中以后才知道 C++ 有 UB 这个东西的。


by 无钩七不改名 @ 2022-12-10 19:43:12

az(我曾经有一次模拟赛写dfs,然后数组下标访问到负数了,windows 100pts,linux 0pts)@hanjinghao


| 下一页