基於DP 位運算的RMQ演算法

2022-05-01 15:24:13 字數 1091 閱讀 5015

**:

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o(n*log(n)),查詢o(1),所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。

問題:給出n個數ai,讓你快速查詢某個區間的的最值。

演算法分類:dp+位運算

演算法分析:這個演算法就是基於dp和位運算子,我們用dp【i 】【j】表示從第 i 位開始,到第 i + 2^j -1 位的最大值或者最小值。

那麼我求dp【i】【j】的時候可以把它分成兩部分,第一部分從 i 到 i + 2 ^( j-1 ) - 1 ,第二部分從 i + 2 ^( j-1 )  到 i + 2^j - 1 次方,其實我們知道二進位制數後乙個是前乙個的二倍,那麼可以把 i ---  i + 2^j  這個區間 通過2^(j-1) 分成相等的兩部分, 那麼轉移方程很容易就寫出來了。

轉移方程: mm [ i ] [ j ] = max ( mm [ i ] [ j - 1 ] , mm [ i + ( 1 << ( j - 1 ) ) ] [ j - 1 ] );

**:

void rmq_isit(bool

ok)

} }

那麼查詢的時候對於任意乙個區間 l -- r ,我們同樣可以得到區間差值 len = (r - l + 1)。

那麼我們這一用小於2^k<=len,的 k 把區間分成可以交叉的兩部分l 到 l+ (1《查詢**:

int rmq(int l,int

r)

例題: poj balanced lineup

ac**

#include #include 

using

namespace

std;

const

int maxn = 50008

;int a[maxn],mx[maxn][30],mn[maxn][30

];int

n,m;

intmain()

for(int j=1; (1

<)

}for(int i=1;i<=m;i++)

return0;

}

位運算和基於位運算的快速冪演算法

與運算 按位與 或運算 按位或 異或運算 按位異或 取反運算 按位取反 左移 右移 移位運算 介紹完二進位制中的基本位運算後,我們開始講解快速冪的演算法 快速冪是基於二進位制的運算的一種快速演算法 如 3 7 2187 7的二進位制為 0111 3 1 3 2 0 3 3 2 3 2 1 9 3 4...

壓縮dp的位運算

壓縮dp用到了二進位制位運算上的東西,整理一下基本內容。位運算的幾個基本操作 1 移位 2 按位與 3 按位或 4 非 5 異或 每個都很簡單,c 上都學過,難的實在那幾個巧妙的利用上。1 判斷乙個數二進位制下第i位是0或1 x 1 i 1 0 1 i 1 構造出來 100.後面i 1個0 與x做與...

DP 亂搞 位運算

今天的題都這麼。這道題後面會用到逆推。首先得判斷是否有合法方案。而且方案明顯會有很多種,但只需要統計算到這一位時答案有多少個1。設f i j 表示算完i位時,答案裡有j個1.考慮轉移,轉移時對答案產生影響的還有兩位間1位置的交集,也就是f i j a i 1 後1的個數,設它為k。交集中1個數就是 ...