介绍
原理
让我们的每一对区间都可以用至多两个区间来进行覆盖,这样我们就可以通过两个区间的最大值比较来得到新的区间的最大值。
实现
我们用
我们就可以得到初始化时的代码
for(int j = 1 ; j <= (int)log2(n) + 1 ; ++ j ){
for(int i = 1;i <= n ; ++ i){
f[i][j] = max(f[i][j-1],f[i + (1LL << (j-1))][j-1]) ;
}
}
对于查询时,根据 l 和 r ,我们可以通过这个区间的长度为
l = read() ;
r = read() ;
int k = log2(r - l + 1) ;
ans = max(f[l][k],f[r-(1<<k)+1][k]) ;

Comments 1 条评论
求更新