为什么用数组记录范围会WA

P3865 【模板】ST 表

```cpp #include<iostream> #include<cmath> #include<cstdio> using namespace std; int n,m,a[1000005],st[1000005][100],bit[100],l,r,b; int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]),st[i][0]=a[i]; int ln=(int)(log(n)/log(2)); for (int i=1;i<=ln;i++){ for (int j=1;j<=n-(1<<i)+1;j++){ st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]); } } for (int i=1;i<=m;i++){ scanf("%d%d",&l,&r); int y=(int)(log(r-l+1)/log(2)); printf("%d\n",max(st[l][y],st[r-(1<<y)+1][y])); } return 0; } ``` 写错了,这是AC代码,但还是不知道为什么开数组就不过
by sr123R456 @ 2022-07-26 09:59:11


改成 ```cpp bit[0]=1;b=1; while (bit[b]<=1000005){ bit[b]=bit[b-1]<<1; ++b; } ``` 即可
by dxy2020 @ 2022-07-26 10:13:50


你b不设成1就是 ``` bit[0]=bit[-1]<<1 ```
by dxy2020 @ 2022-07-26 10:14:40


@ [sr123R456](https://www.luogu.com.cn/user/445303)
by dxy2020 @ 2022-07-26 10:17:54


b初始为零,++b不就先让它加1再算吗,这样后面的b-1不就是0了吗. 这两个效果应该一样吧,bit数组我检查过了,存的数都正确啊,为什么我那样就错了?能详细说下吗? ```cpp bit[0]=1;b=1; while (bit[b-1]<=1000005){ bit[b]=bit[b-1]<<1; ++b; } ``` 还有,while中数组下标应该用b-1吧。 @[小小蒟蒻一只](/user/366254)
by sr123R456 @ 2022-07-26 23:47:22


@[sr123R456](/user/445303) 赋值语句好像是从右向左运算
by dxy2020 @ 2022-07-27 07:59:38


@[小小蒟蒻一只](/user/366254) 如果这样的话,为什么数组里的内容都正确呢?我的赋值语句是不是相当于bit[1]= bit[-1]<<1;呢?
by sr123R456 @ 2022-07-27 09:17:09


@[sr123R456](/user/445303) 那应该UB了吧 我也不大清楚数组里的值为什么是对的。。
by dxy2020 @ 2022-07-27 09:33:26


@[小小蒟蒻一只](/user/366254) UB什么意思?
by sr123R456 @ 2022-07-27 10:46:29


@[sr123R456](/user/445303) [undefined behaviour](https://www.jb51.net/article/105305.htm)
by dxy2020 @ 2022-07-27 11:28:41


| 下一页