首先,这是AC代码:
#include <bits/stdc++.h>
using namespace std;
int dpmax[50005][22],dpmin[50005][22];
int LOG2[50005],a[50005];
void Get_log2(int n)//数组元素就代表log2几
{
LOG2[1] = 0;//log2(1)=0
for(int i=2;i<=n;i++)
LOG2[i] = LOG2[i / 2] + 1;
}
void Get_ans(int n)
{
for(int s=1;s<=n;s++)//第一组,当区间长度为1(即2的零次方)时
dpmin[s][0] = dpmax[s][0] = a[s];
int p = LOG2[n];//倍增法满足(2^p<=n)的最大次方
for(int i=1;i<=p;i++)
for(int s=1;s+(1<<i)<=n+1;s++)//s+(1<<i)<=n则答案不一样,为什么
{
dpmax[s][i] = max(dpmax[s][i-1],dpmax[s + (1 << (i-1))][i-1]);
dpmin[s][i] = min(dpmin[s][i-1],dpmin[s + (1 << (i-1))][i-1]);
}
}
int main()
{
int n,q; cin>>n>>q;
Get_log2(n);//自己算log2(n)
for(int i=1;i<=n;i++)
cin>>a[i];
Get_ans(n);//ST算法的预处理
while(q--)
{
int a,b; cin>>a>>b;
int k = LOG2[b - a + 1];
int maxv = max(dpmax[a][k],dpmax[b-(1<<k)+1][k]);
int minv = min(dpmin[a][k],dpmin[b-(1<<k)+1][k]);
int ans = maxv - minv;
cout<<ans<<endl;
}
return 0;
}
我所不理解的是上述代码中ST算法预处理(也就是Get_ans函数)中
for(int i=1;i<=p;i++)
for(int s=1;s+(1<<i)<=n+1;s++)//s+(1<<i)<=n则答案不一样,为什么
{
dpmax[s][i] = max(dpmax[s][i-1],dpmax[s + (1 << (i-1))][i-1]);
dpmin[s][i] = min(dpmin[s][i-1],dpmin[s + (1 << (i-1))][i-1]);
}
}
我想了很久都没有想明白,我自己所想的是<=n就可以了,但是答案告诉我这是错的,一定得是<=n+1,求大佬解惑