分塊簡單了解

2021-10-01 22:20:36 字數 1556 閱讀 1721

分塊的基本思想是通過適當的劃分,預處理一部分資訊並儲存下來,用空間換取時間,達到時同平衡。

分塊和線段樹的區別在於,分塊演算法可以維護一些線段樹維護不了的東西;

例如單調佇列等,線段樹能維護的東西必須能夠進行資訊合併,而分塊則不需要。

不過,它們也有共同點,分塊和線段樹一樣,分塊需要支援類似標記合併的東西。

簡單來說,分塊演算法就是優化過後的暴力。

簡單,直觀,注意細節。

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更...