RMQ 模板

RMQ(Range Minimum/Maximum Query),即區間最值查詢,是指這樣一個問題:對於長度爲html

n的數列A,回答若干次詢問RMQ(i,j),返回數列A中下標在區間[i,j]中的最小/大值。算法

這個有不少算法:這裏介紹一種比較高效的ST算法解決這個問題。ST(Sparse Table)算法能夠spa

在O(nlogn)時間內進行預處理,而後在O(1)時間內回答每一個查詢。code

     令dp(i,j)表示從  i  開始的,長度爲 2^j  的一段中元素的最小值,htm

便可以遞推出dp(i,j)=min(dp(i,j-1),dp(i+2^(j-1)  ,  j-1))。blog

代碼:get

void ST(int n) { for (int i = 1; i <= n; i++) dp[i][0] = A[i]; for (int j = 1; (1 << j) <= n; j++) { for (int i = 1; i + (1 << j) - 1 <= n; i++) { dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); } } } int RMQ(int l, int r) { int k = 0; while ((1 << (k + 1)) <= r - l + 1) k++; return max(dp[l][k], dp[r - (1 << k) + 1][k]);//int k=(int)(log(double(R-L+1))/log(2.0));
}

轉載來自:http://www.javashuo.com/article/p-cadgyosm-ka.htmlit

相關文章
相關標籤/搜索