倍增法(ST演算法)

2021-10-19 10:08:46 字數 2727 閱讀 7320

3.典型例題

演算法思想

st演算法,適用於rmq問題(區間最大值),也就是求出乙個序列中,數值最大的一項。樸素做法自然是一遍掃瞄找最大值,但是當題目詢問次數很多的時候,就很有可能超時,因此用倍增演算法來進行乙個優化。

以下是st演算法求解rmq問題的實現:

首先,我們用f[i

][j]

f[i][j]

f[i][j

]來表示在序列a中,第i位數字以後數2

j2^j

2j個數之中的最大值,那麼就可以得到f[i

][0]

=a[i

]f[i][0]=a[i]

f[i][0

]=a[

i]。接下來進行乙個dp的過程:

for

(int j =

1; j <=

(log2

(n))

; j++

)for

(int i =

1; i <= n -(1

<< j)+1

; i++

) f[i]

[j]=

max(f[i]

[j -1]

, f[i +(1

<<

(j -1)

)][j -1]

);

// 預處理

void

pre_work()

// 詢問區間[l,r]中最值

intst_query

(int l,

int r)

洛谷 3865【模板】st表

題意:給定乙個長度為 n 的數列,和 m 次詢問,每次給定[l, r],求出每一次詢問的區間內數字的最大值。

題解:模板題

**:

#include

using

namespace std;

intconst n =

1e5+10;

int a[n]

, f[n][32

];int n, m;

// 預處理

void

pre_work()

// 詢問區間[l,r]中最值

intst_query

(int l,

int r)

intmain()

return0;

}

cf1335f. robots on a grid

題意:給出乙個 n×m 的網格,每個格仔有顏色,0 黑 1 白,每個格仔還有乙個方向,表示這個格仔上的機械人會向那個方向走,並保證不會走出格仔

擺放機械人,它們同時開始運動,在任意時刻不能有兩個機械人在同乙個格仔裡。先最大化機械人個數,如果多種方案機械人個數相等,再最大化擺在黑格仔裡的機械人數量。n∗m

<=1

06

n * m <= 10^6

n∗m<=1

06題解:思維+倍增。有乙個比較顯然的結論,如果走了n * m步後,兩個機械人不在同乙個格仔裡面,那麼這兩個機械人永遠不會相遇。因為n * m步後,這兩個機械人已經進入迴圈了,此時沒有相遇的話,那麼分別進入永不相遇的迴圈。那麼對於每乙個格仔,我都可以知道它走n * m後能夠到達的最終的格仔是哪個,那麼我就可以知道最終的格仔是哪個機械人走到的,這個使用倍增就可以做到。如果黑色和白色的機械人都走到同乙個格仔,那麼我優先把這個格仔給黑色的機械人。

**:

#include

#define int long long

using

namespace std;

intconst maxn =

1e6+10;

int n, m, t, white[maxn]

, black[maxn]

, color[maxn]

, f[maxn][21

];string s;

signed

main()

for(

int i =

0; i < n;

++i)

}for

(int j =

1; j <=20;

++j)

// 遍歷不同長度的區間

for(

int i =

0; i < size;

++i)

// 左邊界遍歷

f[i]

[j]= f[f[i]

[j -1]

][j -1]

;// 進行dp操作

for(

int i =

0; i < size;

++i)

int res_all =

0, res_black =0;

for(

int i =

0; i < size;

++i)

cout << res_all <<

" "<< res_black << endl;

}return0;

}

倍增法與st

一篇部落格 最常用,也是最簡單的演算法,實質就是直接對暴力使用倍增優化將複雜度降低達到需求。有樹上的倍增和區間的倍增 depth 為每個節點的深度,fa i j i節點的 2 j 的父親。lg i log 2 1 const int maxn 5000001 int depth maxn fa ma...

ST表(倍增表)

介紹st表之前先看看rmq問題是什麼東西吧 rmq range maximum minimum query 顧名思義,這就是指區間最大或最小值 區間最值 st表 spars table,一種可以解決rmq的,基於倍增的資料結構 令 f i j 表示從 i 開始連續 2 j 個數中的最值,如果 i 後...

真香筆記 倍增 st表

倍增 是什麼 一種非隨機的節省操作的思想 為什麼 節省時間 怎麼弄 將一步一步走轉化為20步 21步 22步 23步 走 應用 1 快速冪 由於11 1 23 0 22 1 21 1 20,故快速冪演算法計算311 38 32 31 具體怎麼算我不是很熟,貌似最大就只用算到8次方所以得出節省時間的結...