倍增:將線性級轉換成對數級,降低時間複雜度
只考慮二的整數冪次,縮小查詢範圍。
運用:1.快速冪:算n的m次方,log(n)
遞推法:
int ans = 1;while
(n)
2.rmq問題:n個數字m次詢問,每次[l,r]中最大值
運用st表,預處理 o(nlogn),查詢o(1)
想法是將每次要查詢的區間的最值預先就搞定了,用2的次冪使得每個f代表【從i到i+2^j-1】這個區間的最大值,然後再在【從i到i+2^(j-1)-1】和這個【從i+2^(j-1)到i+2^(j-1)+2^(j-1)-1】即【從i+2^(j-1)到i+2^j-1】
兩個區間中選最大,其實正好覆蓋了【從i到i+2^j-1】的區間,而該f表達為f【i】【j】——【從i到i+2^j-1】的最大值;
預處理pre1——log值
int log[21];log[
1] = 0
;void pre1(int
n)
預處理pre2——f[i][j]都存入
int f[n][21];void pre2(int
n)
輸出公式:
int s = (l + 1 -r);printf("%d
", max(f[l][s], f[r - (1
<< s) + 1][s]));
知識點 2 6 倍增思想
總目錄 2 演算法基礎 2.6 倍增思想 前言 倍增通常和二分一起介紹,共同點在於 它們都能神奇地將原本複雜度為 n 的過程下降到 log n,對於大型資料而言,這種效率的提高是顯而易見的。子目錄列表 1 二進位制與倍增 2 例題 3 應用 2.6 倍增思想 1 二進位制與倍增 眾所周知,二進位制與...
歸納(二) 倍增
把一步一步往上爬變成一次一次向前跳,從 o n o log 的蛻變,可以解決很多問題。anc i k anc anc i k 1 k 1 就這麼一行。我的 2 級祖先就是我 2 級祖先的 2 級祖先。就憑這句話,就可以解決很多問題了。洛谷p1613跑路 小a的工作不僅繁瑣,更有苛刻的規定,要求小a每...
LCA 二分 倍增
兩個最近的點u和v的最近的公共的祖先稱為最近公共祖先 lca 普通的lca演算法,每算一次lca的時間複雜度為線性o n 這裡講lca 二分的方法。首先對於任意的節點v,利用其父節點的資訊,可以通過par2 v par par v 得到向上走兩步的節點。依此資訊可以通過par4 v par2 par...