RMQ板子
Posted uid001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RMQ板子相关的知识,希望对你有一定的参考价值。
对于RMQ这种静态最值询问, 用线段树的话查询过慢, 一般用ST表预处理后O(1)查询, 下以最大值查询为例, 这里假定$n$不超过5e5
void init() { Log[0] = -1; REP(i,1,n) f[0][i] = a[i], Log[i]=Log[i>>1]+1; REP(j,1,19) for (int i=1;i+(1<<j-1)<=*s; ++i) { f[j][i] = max(f[j-1][i],f[j-1][i+(1<<j-1)]); } } int RMQ(int l, int r) { if (l>r) return -INF; int t = Log[r-l+1]; return max(f[t][l],f[t][r-(1<<t)+1]); }
若需要求最大值的下标, 可以这样写
void init() { Log[0]=-1; REP(i,1,n) f[0][i] = i, Log[i]=Log[i>>1]+1; REP(j,1,19) for (int i=1; i+(1<<j)-1<=n; i++) { int x = f[i][j-1], y = f[i+(1<<(j-1))][j-1]; f[i][j]=a[x]>a[y]?x:y; } } int RMQ(int l, int r) { if (l>r) return -1; int k = Log[r-l+1]; int x = f[l][k], y = f[r-(1<<k)+1][k]; return a[x]>a[y]?x:y; }
以上是关于RMQ板子的主要内容,如果未能解决你的问题,请参考以下文章