±1rmq其實是rmq的乙個特殊情況,它的特殊性體現在:序列中每兩個相鄰元素的差是1或-1。即:
對於這種特殊情況,有一種方法可以將rmq的時間降至常數級別,即用
的時間解決。
可以發現,如果lca用dfs+rmq的方法解決,則rmq部分正好是±1rmq。所以,如果會了這種方法,將可以用
這裡簡單(因為我不會)介紹一下:rmq標準演算法:可以將原數列通過
的時間建立成笛卡爾樹,再轉換成lca,然後再用±1rmq處理,則普通rmq的時間複雜度也可以是
。。。(好神奇)
回到正題。。。那麼,±1rmq該怎麼做呢?
考慮分塊,是否可以將序列分成b塊,每一塊都搞一次rmq,然後大的也搞一次rmq?
如圖所示:
很明顯,這樣做是可以的。
則查詢操作可分為三塊,最左,最右邊的塊搞一次內部查詢。然後中間所有塊中再做一次塊與塊之間的查詢操作。最後合併到一起即可。
如圖:分塊的思路確定了。那麼每個塊的長度我們該如何確定呢?
是否可以將每塊的長度len定為
?如果這樣就沒有利用好+1,-1這個條件了。
在這裡,我們設
。則塊數
。注意到相鄰的兩個數只有+1,-1兩個條件。根據乘法原理,最多只有
種本質不同的情況。
那麼,我們可以先預處理出所有本質不同的情況的所有答案,即每一種本質不同情況都做一次rmq。易知,這樣做的時間複雜度不超過常數級別。
做完rmq預處理後,就可以根據每一塊+1/-1的性質套進上面的情況中,加上偏移量offset即可。
記第i塊的最小值為a'[i],然後根據序列a』做一次塊間的rmq即可。
則預處理的時間複雜度為
。每次查詢的時間複雜度為
。
約束rmq 約束RMQ
不知道為什麼網上找不到太多相關的資料,所以寫乙個小總結,並附有能用的 拋磚引玉。約束rmq,就是rmq區間必須滿足兩項之差最大為1,採用st表的話,這時候有o n 建表,o 1 查詢的優秀複雜度 求lca,通過dfs把原樹轉化為深度序列,就等價於求區間最小值 取到的位置 由於dfs的性質,該序列兩個...
約束RMQ 1RMQ演算法 複雜度O n
約束rmq的解法 現在仍舊用a 0,n 1 表示問題中的數列,這裡有 a i a i 1 1 i 1,2,n 1 成立。將a分解為長度為l log n 2 的塊。設a i 為第i塊中的最小值,b i 為該最小值的位置。a i 和b i 的長度均為n l,所以用st演算法處理a 陣列的時空複雜度均為o...
RMQ 超級鋼琴
超級鋼琴 超級鋼琴 問題描述 小z 是乙個小有名氣的鋼琴家,最近 c 博士送給了小z一架超級鋼琴,小 z 希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出 n個音符,編號為 1至n。第i個音符的美妙度為 ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數...