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次方所以得出節省時間的結...