关于st表dp部分枚举顺序的一个问题
查看原帖
关于st表dp部分枚举顺序的一个问题
608251
zfznbnb楼主2022/12/3 11:04

学校刚讲完st表,练了一道模板题,然后就挂了,12pts

经过与正解的比对,我于是将dp枚举i和j调换了一下位置,但这次……竟然AC了!

代码如下,请问为什么在st表的预处理过程中,先枚举j后枚举i可以AC,但先枚举i后枚举j却会WA掉;这两者有什么区别吗?

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[1000005],dp[1000005][21];
int getmax(int l,int r){
	int k=log2(r-l+1);
	return max(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main(){
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		dp[i][0]=a[i];
	}
	for(int i=1;i<=n;i++){//(int j=1;j<=21;j++)这是修改后AC的
		for(int j=1;i+(1<<j)-1<=n;j++){//(int i=1;i+(1<<j)-1<=n;i++)这是修改后AC的
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
		}
	}
	for(int i=1;i<=k;i++){
		int l,r;
		scanf("%d %d",&l,&r);
		printf("%d\n",getmax(l,r));
	}
	return 0;
}

附:样例

输入:

8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8

输出:

9
9
7
7
9
8
7
9
2022/12/3 11:04
加载中...