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...