關於一些莫隊的總結

2022-05-07 22:33:19 字數 1110 閱讀 9286

最近學了一些莫隊的應用,先總結如下。

對於某一些莫隊,當它的修改操作複雜度較高,又具有可差分的性質時,我們可以考慮如下優化方法————給莫隊詢問操作對應的修改操作「二次離線」。具體來說,設當前左右指標為nl,nr,現在的詢問左右指標為ql,qr,有:

$1.ql \lt nl:delta=\sum_^ ans([1,r],i)-\sum_^ ans([1,i],i) $

\(2.ql \gt nl:-delta=\sum_^ ans([1,r],i)-\sum_^ ans([1,i],i)\)

\(3.qr \lt nr:-delta=\sum_^ ans([1,i-1],i)-\sum_^ ans([1,l-1],i)\)

\(4.qr \gt nr:delta=\sum_^ ans([1,i-1],i)-\sum_^ ans([1,l-1],i)\)

對於每個式子只與邊界的部分,可以字首和預處理,然後\(o(1)\)查詢,對於另外一部分,考慮離線,可以開鄰接表掛在對應的nl-1或nr下面,然後預處理從左往右掃一遍即可。最後維護詢問區間的答案時就可以\(o(1)\)移動指標,這樣做當修改操作複雜度小於\(o(\sqrt)\)時,往往能夠給總時間複雜度優化掉乙個修改的複雜度,乙個例子是luogu 第十四分塊(前體),就可以優化掉每一次將數插入桶中的\(o(3432)\)。

首先肯定是先用dfs序將樹轉化為序列,dfs序的選擇視不同的詢問而定。比如詢問子樹,就使用普通的入棧dfs序,而詢問樹上路徑則使用入棧出棧尤拉序(這樣一條路徑就對應序列上的一段,只是要特判\(lca\),修改暴力即可)。現在考慮如何分塊,有兩種分塊方式,看個人喜好吧,這裡兩種都說一說:

1.就使用序列上的那一套,將dfs序分為\(\sqrt\)塊,在將詢問按所在塊端點排序即可(可能跑的要慢一點,但是時間複雜度是對的)。

2.考慮樹分塊(這個應該屬於***的方法),具體可以參考[scoi2005]王室聯邦,將樹分為\((\sqrt)\)。現在對於詢問考慮左端點按所在樹塊,右端點按dfs序排序即可。

一道不帶修改的樹上莫隊sp10707 cot2 - count on a tree ii。

那麼帶修改樹上莫隊呢?就是把時間加做第三關鍵字,同時改分塊大小為\(^}\)即可,對於時間軸上的修改暴力即可,複雜度是\(o(n^})\),這裡有一道例題糖果公園。

關於stringstream的一些總結

c 標準庫中的提供了比ansi c的更高階的一些功能,即單純性 型別安全和可擴充套件性。可以使用這些庫來實現安全和自動的型別轉換。如果你已習慣了風格的轉換,也許你首先會問 為什麼要花額外的精力來學習基於的型別轉換呢?也許對下面乙個簡單的例子的回顧能夠說服你。假設你想用sprintf 函式將乙個變數從...

關於JSON的一些總結

一 關於json json是一種類似於xml的通用資料交換格式,具有比xml更高的傳輸效率.從結構上看,所有的資料 data 最終都可以分解成三種型別 第一種型別是標量 scalar 也就是乙個單獨的字串 string 或數字 numbers 比如 北京 這個單獨的詞。第二種型別是序列 sequen...

關於指標的一些總結

指標和陣列一樣,都是基於其它型別的。指標的宣告 int p updates 運算子兩邊的空格是可選的。對每個指標變數命名,都需要乙個 變數名,為取址,它的值為變數的位址 32位 指標變數,為指標儲存的位址所儲存的值。可以通過改變它來改變。malloc 可以分配記憶體,但c 更好的方法是使用new。i...