分塊的九個基礎應用

2022-09-21 12:09:12 字數 2612 閱讀 3285

\(\quad\)區間加法,單點詢問

\(\quad\)問題:給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。

\(\quad\)對每個塊加個 tag 即可。

\(\quad\) 區間加法,詢問區間內小於某個值 x 的元素個數

\(\quad\)問題:給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 x 的元素個數。

\(\quad\) 預處理的時候將每一塊都排序。

\(\quad\) 區間加法仍然是整塊的打 tag ,不整塊的重新排序。

\(\quad\)詢問就是整塊中二分查詢,不整塊暴力。

\(\quad\)區間加法,詢問區間內小於某個值 x 的前驅

\(\quad\)問題:給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 x 的前驅。

\(\quad\)和 2 一樣的思想,將塊內元素二分查詢,再暴力查詢左右不完整的塊,最後比較大小,取 max 即可。

\(\quad\)區間加法,詢問區間和

\(\quad\)問題:給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間和。

\(\quad\)整塊的就打 tag ,不整塊的就暴力修改。

\(\quad\)區間開方,詢問區間和

\(\quad\)問題:給出乙個長為 n 的數列,數列中的元素最大為 \(2^-1\) ,以及 n 個操作,操作涉及區間開方,詢問區間和。

\(\quad\)不難發現修改操作只有向下取整開方,而乙個數經過幾次開方後就會變成 1 。

\(\quad\)因此同樣對不完整的塊暴力開,如果是整塊,那就記錄這個塊中是否全都是 1 ,如果是 1 ,那就跳過這些塊,否則就對塊中元素暴力修改。

\(\quad\)由於元素最大為 \(2^-1\) ,所以最多開 5 次就為 1 ,複雜度仍然比較可觀。

\(\quad\)單點插入,單點詢問

\(\quad\)問題:給出乙個長為 n 的數列,操作涉及單點插入,單點詢問,資料隨機生成。

\(\quad\)可以在塊內維護陣列以外的資料結構使其更具有拓展性,比如在每個塊中放乙個 multiset, set , vector ......

這樣的話會讓插入和刪除比較方便。

\(\quad\)對於這一題,資料是隨機生成的,就在每乙個塊中維護乙個 vector ,每次插入時找到位置就暴力插入,將塊內元素直接向後移動一位,複雜度不會太高。

\(\quad\)但對於資料不隨機的情況下,如果乙個塊內大量插入就會使塊的大小超過 \(\sqrt n\) ,這樣就對塊內暴力的複雜度沒***了,此時就需要引用乙個新的操作:重構,即重新分塊。

\(\quad\)重構是指,每根號 n 次插入後,重新將數列分塊,由於重構所需時間為線性,次數為根號,所以重構的時間複雜度沒什麼問題,且保證了每個塊的大小相對均衡。

\(\quad\)區間乘法與加法,單點詢問

\(\quad\)問題:給出乙個長為 n 的數列,操作涉及區間乘法,區間加法,單點詢問。

\(\quad\) 無非是 2 個標記,但要注意的是在完整塊中可以直接打,但是在不完整塊中,就要將整個不完整塊更新到最新塊後再暴力。

\(\quad\)詢問區間某值個數,區間賦值

\(\quad\)問題:給出乙個長為 n 的數列,操作涉及區間詢問等於乙個數 x 的元素個數,並將這個區間的所有元素改為 x。

\(\quad\)採用模型五的方法,採用分塊優化暴力,在維護每乙個塊時,判斷該塊是否只有一種權值,若不是只有一種權值,那麼就暴力統計答案,然後修改標記,對於不完整塊同樣使用暴力維護。

\(\quad\)詢問區間眾數

\(\quad\)問題:給出乙個長為 n 的數列,以及 n 個操作,操作涉及詢問區間的最小眾數。

\(\quad\)分塊演算法的優越性之一就在於能詢問區間眾數,這是線段樹都解決不了的問題。

\(\quad\)關鍵在於處理兩個陣列

s[x][y]->前x個塊中y有幾個

f[x][y]->第x個塊到第y個塊的眾數是誰

void init()

fo(i,1,sum){

fo(j,i,sum){

int max=f[i][j-1];

fo(k,(j-1)*sq+1,min(j*sq,n)){

if((s[j][a[k]]-s[i-1][a[k]]>s[j][max]-s[i-1][max]) || (s[j][a[k]]-s[i-1][a[k]]=s[j][max]-s[i-1][max] && a[k]\(\quad\)至於查詢我們可以想象乙個 l~r 的區間的眾數隻會取中間塊的眾數或者旁邊還出現過的數字,這時就直接暴力列舉。

\(\quad\)複雜度都是

\[o(n\sqrt n)

\]\(\quad\)值得注意的是,在進行分塊的時候,有些題會卡常,即將分塊分成根號仍然會超時,此時就需要用兩塊分塊大小不同的**對拍,根據執行時間來不斷調整分塊大小,以減少常數。

分塊 乙個奇怪的分塊演算法 B樹 分塊

資料結構,支援以下兩種操作 空間複雜度 o n 預處理時間複雜度 o n 其實這個東西的本質是將b樹留下來3層,然後葉子節點上跑暴力。這裡實現了乙個支援 o 1 區間改和 o n 2 單點查的資料結構。空間複雜度 o n 2 隨便維護一下這個區間內的 frac 種區間的tag。修改的時候直接改對應區...

CRM的九個秘密

本文講的是crm的九個秘密,it168 資訊 客戶關係管理 crm 產品問世已有二十多年,而saas廠商銷售crm套件也有近十個年頭了。儘管客戶們對crm已是相當熟悉,但令人吃驚的是,客戶們對crm仍然存在相當大的誤區。本文給出的忠告適用於任何crm系統,但我們還是重點介紹了像salesforce ...

Python 基礎 變數的輸入 九

1.識別符號和關鍵字 1.1 識別符號 識別符號就是程式設計師定義的變數名,函式名 名字需要有見明知義的效果 通過以下命令可以檢視 python 中的關鍵字 import keyword print keyword kwlist false none true and as assert async...