学校刚讲完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++){
for(int j=1;i+(1<<j)-1<=n;j++){
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