ST表易错处
\(updata : 2021.12.6\)
思想 : 看似有很多细节 , 但只要时刻牢记 \(f[i][j]\) 表示区间 \([i , i+(1<
\(① :\) 更新\(f[i][j]\) , \(j\) 的枚举一定在外层 , 看方程转移 f[i][j] = max(f[i][j-1] , f[i + (1<
而且注意是 i + (1<
i + 1<
\(② :\)
int t = lg[r-l+1]
而不是 int t = lg[r-l]
将 \(l = 1 , r = 4\) 代入即可验证后者是错的.
#include
#include
using namespace std;
const int N = 1e5+1;
int n,m,a[N],f[N][20],lg[N];
int main()
{
scanf("%d%d",&n,&m);
lg[0] = -1;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
f[i][0] = a[i];
lg[i] = lg[i>>1] + 1;
}
for(int j=1;j<=19;++j)
for(int i=1; i+(1<