ST表求解靜態RMQ 二維RMQ 模版

2021-10-08 08:14:53 字數 2272 閱讀 4129

rmq(range minimum query),範圍最小值問題。具體表現為一下一類問題:

給出乙個 n 個元素的陣列 a1,

a2,…

,a

na1,a2,…,an

a1,a2,

…,an

,求解 min

(l,r

)min(l,r)

min(l,

r): 計算 min

al,a

l+1,

…,ar

minmi

nal,

al+1

,…,arrm

qrmq

rmq 問題有很多解法,其中較為快捷和簡便的是 tarjan 的 spa

rse−

tabl

esparse−table

sparse

−tab

le演算法,簡稱 st 表。

s pa

rse−

tabl

esparse−table

sparse

−tab

le演算法基於倍增思想,整個演算法由預處理和查詢兩部分組成。

#include

using namespace std;

const

int mxn =

1e5+10;

int ar[mxn]

;int st[mxn][30

], log[mxn]

;voidst(

int n)

intmain()

return0;

}

二維rmq:快速求矩形的子矩陣中的最大、最小值

#include

#include

#include

#include

#include

#include

#include

#include

/* #include */

#include

#include

void

fre(

)void

fre(

)#define ios ios::sync_with_stdio(false)

#define pi acos(-1)

#define pb push_back

#define fi first

#define se second

#define ll long long

#define ull unsigned long long

#define db double

#define pir pair

#define pir pair

#define m_p make_pair

#define inf 0x3f3f3f3f

#define esp 1e-7

#define mod (ll)(1e9 + 7)

#define for_(i, s, e) for(int i = (ll)(s); i <= (ll)(e); i ++)

#define rep_(i, e, s) for(int i = (ll)(e); i >= (ll)(s); i --)

#define sc scanf

#define pr printf

#define sd(a) scanf("%d", &a)

#define ss(a) scanf("%s", a)

using namespace std;

#define max(a, b, c, d) max(max(a, b), max(c, d));

#define min(a, b, c, d) min(min(a, b), min(c, d));

const

int mxn =

255;

int mz[mxn]

[mxn]

;int log[mxn]

;int st1[mxn]

[mxn][8

][8]

;int st2[mxn]

[mxn][8

][8]

;void

init

(int n)

voidst(

int n)

else

//否則的話,就按列將所求的區域分成兩小塊}}

}int

main()

return0;

}

模板 ST表求解RMQ問題

rm q ra ngem inim umqu ery r mq ran gemi nimu mque ry 範圍最小值問題。具體表現為一下一類問題 給出乙個 n n 個元素的陣列 a1 a2,an role presentation style position relative a1,a2,ana...

二維RMQ問題

前置知識 一維rmq及其拓展 對於乙個n m n m的矩陣,每個格仔有乙個值,有q q個詢問,每次詢問你乙個子矩陣中的最大值。1 n,m 500,q 1061 n,m 500 q 1 06每次花子矩陣大小的複雜度去查詢。複雜度最壞o q n m o q n m 我們用n n棵線段樹或者樹狀陣列來維護...

二維RMQ模板

int main for int i 0 1 i n i 因為i 0時的 和 i 0 j 0時的一樣 所以就合併了 i 0 j 0時 查詢 詢問的話,也要稍加改變,一維rmq返回的是一段區間的最值,而二維的rmq需要返回的乙個矩陣的最值,所以返回的時候要注意,所返回的一定要構成乙個矩陣 按照一維rm...