RMQ(模板 ST 區間最值,區間頻繁次數)

2021-06-26 18:47:14 字數 735 閱讀 7968

ps:

介紹:rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o(n*log(n)),查詢o(1),所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。

1、求區間的最大值和最小值!

**如下:

#include #include #include #include using namespace std;

const int maxn = 100117;

int n,query;

int num[maxn];

int f_min[maxn][20],f_max[maxn][20];

void init()

for(int i = 1; (1<

2、求區間內出現次數最多的數字出現的次數!

**如下:

#include #include #include using namespace std;

const int maxn = 100017;

int num[maxn], f[maxn], max[maxn][20];

int n;

int max(int a,int b)

int rmq_max(int l,int r)

{ if(l > r)

return 0;

int k = log((double)(r-l+1))/log(2.0);

return max(max[l][k],max[r-(1<

RMQ 區間最值 模板

rmq 的全稱為range max min query。構造dp陣列的時間為o nlogn 但是查詢時間為o 1 所以當資料量小於logn時,用樸素遍歷找最值就好,但是請求次數大於logn時,就要用這個模板。利用動態規劃的思想。int order maxn 使每乙個2 order i i 2 ord...

模板 RMQ求區間最值

rmq簡單來說就是求區間的最大值 最小值 核心演算法 動態規劃 rmq 以下以求最大值為例 f i,j 表示 從 i 開始 到i 2j 1這個區間中的最大值 狀態轉移方程 f i,j max f i,j 1 f i 2 j 1,j 1 我們可以把區間 i,i 2j 1 平均分為兩個區間,因為j 1的...

st演算法模板(區間最值)

f 1,0 表示第1個數起,長度為2 0 1的最大值,其實就是3這個數。f 1,2 5,f 1,3 8,f 2,0 2,f 2,1 4 從這裡可以看出f i,0 其實就等於a i 這樣,dp的狀態 初值都已經有了,剩下的就是狀態轉移方程。我們把f i,j j 1 平均分成兩段 因為j 1時,f i,...