演算法討論 RMQ 學習筆記

2021-08-02 10:35:17 字數 860 閱讀 2536

模板及講解

運用st表實現區間詢問區間最大/最小,初始化時間複雜度o(

nlog

n), 查詢o(

1)模板題:poj 3264

#include

#include

#include

#include

#define ms(i, j) memset(i, j, sizeof i)

using

namespace

std;

const

int maxn = 50000 + 5;

int n, q;

int h[maxn], fmaxi[maxn][25], fmini[maxn][25];

//h為原陣列,fmaxi[i][j]為從i開始長度為2^j的區間最小值

void initrmq()

}}int rmqmax(int x, int y)

int rmqmin(int x, int y)

void clear() {}

void init()

void solve()

}int main()

常見題型

1.求區間最大/最小值

q:給出乙個區間,詢問某個子區間的最大/最小值。(沒有修改操作)

解:因為不用修改,所以用rmqo(

1)查詢最優,常數也小。

例題:poj 3264

2.求lca

q:給出一棵樹,求兩個節點的lca。

解: 例題:

RMQ演算法學習筆記

以我個人的看法,與其說rmq是演算法,還不如說是一類問題,即區間 range 最大 小值 minimum maximum 查詢 query 有三種辦法可以解決這類問題 第一種是暴力查詢 for int i n1,i n2 i 如果查詢次數是0第三種st方法,可以在o nlogn 的預處理之後做到o ...

演算法討論 樹鏈剖分 學習筆記

模板及講解 樹鏈剖分解決樹上的修改問題。將樹剖成一條條鏈,再用線段樹 樹狀陣列等維護 常見題型 1.點權問題 q 修改某些點的權進行詢問。解 直接樹剖進行線段樹 樹狀陣列維護 例題 bzoj1036 2.邊權問題 q 修改某些邊的權進行詢問。解 樹剖後維護點權,每個點的點權為這個點到他父親之間邊權,...

再談RMQ演算法

大家知道rmq演算法就是求乙個區間裡的任意區間的最大值和最小值的高效演算法,因為只需要乙個預處理就可以在o 1 的時間裡算出任意區間的最值。所以當遇到在乙個區間裡求最值之差不超過某乙個數的最長子區間問題就可以利用該方法,當然還需要用到二分演算法。舉個例子 在8,4,2,4,3,2,4,5,2,6這個...