ST算法(Sparse Table)
阿新 • • 發佈:2018-08-11
st算法 nbsp memset can cpp 最大 給定 sparse 繼續
RMQ問題:
給定一個序列,每次詢問一個區間最小值 / 最大值。
沒有修改。
//拿區間最大值來舉例。 memset(ans, -INF, sizeof(ans)); for (int i = 1; i <= n; i++) ans[i][0] = a[i]; for (int j = 1; (1<<j) <= n; j++) //枚舉長度為2^j的區間 for (int i = 1; i+(1<<j)-1 <= n; i++) //枚舉區間起點 ans[i][j] = max(ans[i][j-1], ans[i+(1<<(j-1))][j-1]); //顯然,長度為2^j的區間由2^(j-1)的區間更新。 for (int i = 1; i <= q; i++) { int l, r, k = 0; scanf("%d%d", &l, &r); while((1<<(k+1)) <= r-l+1) k++; //若2^k+1還是不超過所求區間的長度,那麽說明k可以繼續加1 printf("%d\n", max(ans[l][k], ans[r-(1<<k)+1][k])); //兩個區間可能有相交的部分,但由於是求最值,所以無影響。 }
ST算法(Sparse Table)