ST表模板
//ST表预处理O(nlogn),查询O(1),但不支持在线修改 //dp [ i, j ]表示[ i, i+2^j-1]这个区间内的最值 //把dp [i,j]平均分成两段(因为dp [ i,j ]一定是偶数个数字)。 //从 i 到i + 2 ^ (j - 1) - 1为一段,i + 2 ^ (j - 1)到i + 2 ^ j - 1为一段(长度都为2 ^ (j - 1))。 int dpMin[50005][20],dpMax[50005][20]; int a[50005]; int n,q; void Init() { for(int i=1;i<=n;i++) dpMin[i][0] = dpMax[i][0] = a[i]; for (int j=1;j<=log(n)/log(2);j++) //只能j在外,i在内 { for(int i=1;i<=n;i++) { if (i+(1<<j)-1<=n) { dpMin[i][j]=min(dpMin[i][j-1],dpMin[i+(1<<(j-1))][j-1]); dpMax[i][j]=max(dpMax[i][j-1],dpMax[i+(1<<(j-1))][j-1]); } else break; } } } int ST_min(int l,int r) { int k=log(r-l+1)/log(2.0); return min(dpMin[l][k],dpMin[r-(1<<k)+1][k]); } int ST_max(int l,int r) { int k=log(r-l+1)/log(2.0); return max(dpMax[l][k],dpMax[r-(1<<k)+1][k]); }
模板题:https://blog.csdn.net/baodream/article/details/80206556