分塊 基本思想詳解

2021-09-25 22:13:12 字數 1827 閱讀 1666

本蒟蒻剛剛看懂了分塊於是就出來寫一篇部落格

千燈給你們整理一下分塊。

一般來說,看到給乙個區間[l,r]增加一定值,或者搜尋乙個區間那麼就可以用樹狀陣列 ,分塊做。

樹狀陣列比分塊快

分塊其實是一種優化過的暴力。

首先我們真的要把這個東東切塊

↑一般來說分成n

\sqrt n

n​塊(分不平均沒事極力掩蓋畫圖水平差 ),每一塊管理n

\sqrt n

n​個點,我們定義block(區塊)=n

\sqrt n

n​,每一塊管理block個點。

然後開乙個陣列seat(位置),來確定第i個點在哪個區域(呼叫起來比較快)。

for(register int i=1;i<=n;++i)

seat[i]=(i-1)/block+1;//第block個點應該屬於第乙個區塊

然後我們用乙個陣列value_block記錄組的值,用value_drop記錄單個點的值

所以對於第i個點的真實值應該是value_block[seat[i]]+value_drop[i]

因為掃[l,r]的區間時會有 : 不完整的區塊+完整的區塊+不完整的區塊

比如這樣的圖↑在區間[l,r]中間,包含了完整的塊(綠色),不完整的塊(咖啡色)

對於完整的塊我們在value_block[ ]上加,最高的複雜度就是全掃一遍o(n

)o(\sqrt n)

o(n​

)對於剩下的不完整的塊在value_drop[ ]乙個點乙個點加,最多就是o(2

×n−2

)o(2×\sqrt n-2)

o(2×n​

−2)複雜度高不到**去,但是比樹狀陣列慢好多。

然後講一下特殊情況(**中會特殊處理qaq)↓:

那麼理論講完,來看看**。

對於靠近l的咖啡色塊的處理↓:

int end_left=min(seat[l]*block,r);//seat[l]*block,處理出l所在區域的最右邊

//min中有r是因為特殊情況,這種情況咖啡色部分是不到該區塊底的

for(register i=l;i<=end_left;++i)

value_drop[i]+=what;

對於靠近r的咖啡色塊的處理↓:

int start_right=max((seat[r]-1)*block+1,l)

//與處理l同理,(seat[r]-1)*block+1是r所在區塊的第乙個點

//max中加入l是怕特殊情況

for(register i=start_right;i<=r;++i)

value_drop[i]+=what;

然後就是對綠色區塊的處理↓:

for(register i=seat[l]+1;i<=seat[r]-1;++i)

value_block[i]+=what;

這大概就是基本理論(區間加法)

雖然沒有樹狀陣列快但是很好理解,(而且什麼都能維護)。

qaq有不對的地方請大佬指出

MVP基本思想

mvp的邏輯性思維都在p層,他降低了頁面的耦合度,具備低耦合的特性,mvp的出現使 更具邏輯性 首先我們看到分包的嚴謹性 mvp的結構分析 p層負責整體邏輯並且將m層和v層聯絡起來,m層主要負責 塊,callback將結果集返回p層,v層最後展示檢視 注意以下介面 public inte ce my...

git基本思想

git相比叫傳統的基於檔案svn優勢明顯,主要體現在天然分布式不怕丟失 不以檔案為為基礎,基於git的資料庫 commit雜湊健值檔案 的版本管理,分支 標籤等操作飛速,而不是緩慢地檔案和目錄操作 git下每個人都有乙個獨特的工作區和分支,不必實時和中心伺服器同步就可以 帶有社交性質的基於fork ...

敏捷開發基本思想

敏捷開發是由一些業界專家針對一些企業現狀提出了一些讓軟體開發團隊具有快速工作 響應變化能力的價值觀和原則,並於2001初成立了敏捷聯盟。他們正在通過親身實踐以及幫助他人實踐,揭示更好的軟體開發方法。通過這項工作,他們認為 個體和互動 勝過 過程和工具 可以工作的軟體 勝過 面面俱到的文件 客戶合作 ...