一道莫隊好題。
我們需要考慮的是如何去統計乙個區間內的符合題意的答案。
這裡有兩種做法:
做法一:樹狀陣列/線段樹。
我們可以開乙個值域樹狀陣列/值域線段樹,在每一次莫隊增/刪的時候我們在對應位置進行單點修改操作,維護一下乙個區間內的數的個數以及不同數的個數。
最後統計答案的時候,進行一次區間查詢操作。
時間複雜度分析(不計預處理複雜度):
莫隊轉移複雜度是 \(o(n \sqrt)\),其中塊長是 \(\dfrac}\),塊數是 \(\sqrt\),在轉移過程中線段樹單點修改和區間查詢複雜度都是 \(o(\log n)\),因此總複雜度是 \(o(n \sqrt \log n + \sqrt \log n) \to o(n \sqrt \log n)\)。
由於 \(n,m\) 同階,上述複雜度可以記為 \(o(n \sqrt \log n)\)。
做法二:
發現上述做法對於修改操作和查詢操作複雜度是一樣的,都是 \(o(\log n)\)。
但是顯然查詢複雜度 \(o(\sqrt)\) 遠小於轉移複雜度 \(o(n \sqrt )\),因此我們可以考慮使用一種奇怪的資料結構使得其能夠 \(o(1)\) 修改,\(o(?) \leq o(n)\) 修改。
這裡就有一種資料結構叫做值域分塊。
對於修改操作,我們直接在對應位置上修改,複雜度 \(o(1)\)。
查詢的時候,我們進行一次區間查詢,複雜度 \(o(\sqrt)\),\(v\) 是值域。
時間複雜度分析:
轉移操作總複雜度是 \(o(n \sqrt)\),修改操作 \(o(1)\)。
查詢操作總複雜度是 \(o(\sqrt)\),單次查詢 \(o(\sqrt)\)。
因此總複雜度是 \(o(n\sqrt+\sqrt)\)。
由於 \(n,m,v\) 同階,上述複雜度可以簡記為 \(o(n\sqrt+\sqrt)=o(n\sqrt+n)=o(n\sqrt)\),發現比做法一少了乙個 \(\log\)。
作者採用的是第二種做法。
code:github codebase-of-plozia p4396 [ahoi2013]作業.cpp
P1403 AHOI2005 約數研究
科學家們在samuel星球上的探險得到了豐富的能源儲備,這使得空間站中大型計算機 samuel ii 的長時間運算成為了可能。由於在去年一年的辛苦工作取得了不錯的成績,小聯被允許用 samuel ii 進行數學研究。小聯最近在研究和約數有關的問題,他統計每個正數n的約數的個數,並以f n 來表示。例...
P2550 AHOI2001 彩票搖獎
為了豐富人民群眾的生活 支援某些社會公益事業,北塔市設定了一 項彩票。該彩票的規則是 1 每張彩票上印有 7 個各不相同的號碼,且這些號碼的取指範圍為 1 33。2 每次在兌獎前都會公布乙個由七個各不相同的號碼構成的中獎號碼。3 共設定 7 個獎項,特等獎和一等獎至六等獎。兌獎規則如下 特等獎 要求...
P2536 AHOI2005 病毒檢測
對於 符號,明明可以讓相同位置再次匹配下乙個,或者跳過當前位置匹配,但是卻寫了個把trie的子樹全部push進佇列的垃圾寫法,結果一直mle 告辭模板串多且不長,可以塞到trie樹里,這個東西貌似叫trie樹上模糊匹配?然後直接bfs爆搜,注意記錄乙個vis i j 表示第i個節點和第j個位置匹配的...