分塊的基本思想是通過適當的劃分,預處理一部分資訊並儲存下來,用空間換取時間,達到時同平衡。
分塊和線段樹的區別在於,分塊演算法可以維護一些線段樹維護不了的東西;
例如單調佇列等,線段樹能維護的東西必須能夠進行資訊合併,而分塊則不需要。
不過,它們也有共同點,分塊和線段樹一樣,分塊需要支援類似標記合併的東西。
簡單來說,分塊演算法就是優化過後的暴力。
簡單,直觀,注意細節。
poj3468
演算法實現:
這種演算法會將序列進行分塊,設定乙個上限m,每一塊有至m多個元素。
在序列分塊問題上,一般會嚴格要求每個塊都要有m個元素,
這樣就會分成約n/m塊.(最後乙個塊除外)
如果是區間[l,r]修改,若l與r同時處於第i段則直接把 l 到 r 的陣列值 都加value。同時修改
該段的區間和。否則設 l 處於 x 段 r 處於 y 段 對於x 與 y 中間的段 add[i] += value.
開頭與結尾不足一端的部分, 按照第一種情況暴力更新。
查詢操作與修改操作類似,對於中間跨過的整塊,直接利用塊儲存的資訊統計答案,
兩端剩餘部分可以暴力掃瞄統計。
我們需要與處理一些陣列 sum, 其中 sum[i] 表示第i塊的區間和。add[i] 表示第i快的「增量標記」。
這**其實沒什麼可以說的,注意一些細節就好了
#include
#include
#include
using
namespace std;
const
int n =
1e5+7;
int a[n]
;long
long sum[n]
, add[n]
;int pos[n]
, l[n]
, r[n]
;// pos陣列用來標記每個點處於哪個塊, l,r陣列分別表示每塊的起始於結束
void
modify
(int l,
int r,
int val)
else
}long
long
query
(int l,
int r)
else
return ans;
}int main ()if
(r[t]
< n) l[
++t]
=(t-1)
*sqrt
(n)+
1, r[t]
= n;
for(
int i =
1; i <= t; i ++)}
char opt[3]
;int x, y, val;
for(
int i =
0; i < m; i ++
)else printf (
"%lld\n"
,query
(x, y));
}return0;
}
分塊基礎(簡單易懂)
分塊 分塊想當於優雅的暴力,主要是求區間的問題。分塊即將一段數分成很多塊,我們通常以x sqrt n 來表示乙個塊的大小 num ceil n times 1.0 x 來表示塊的個數 分塊主要需要的就是3個陣列,pos i 是來表示第i個數所在的塊 l i 表示第i個塊的左端點 r i 表示第i個塊...
C C 簡單實現檔案分塊
c語言簡單實現檔案分塊 模組1 分割檔案 指定目標輸入檔案 檔名或檔案路徑 和分割尺寸,要求分割尺寸 單位 mb 為正整數,且範圍在 min size,max size 分割後產生塊檔案,命名格式為 part 編號。模組2 合併檔案 指定目標輸出檔案 檔名或檔案路徑 順序合併塊檔案。include ...
sql簡單了解
sql是一種資料庫語言,資料庫是用來儲存 管理 組織資料的倉庫。sql中有許多的關鍵字,現在只了解下很重要的,經常出現的關鍵字。查詢select,要和from連用。where是指明位置的關鍵字,其內容很豐富。delete刪除,刪除無儲存。delete from xx where xx。update更...