才發現掃瞄線可以用樹狀陣列搞... 致遠星患者
(另外根據這篇博文的內容怎麼越來越感覺自己往 pj 入門靠攏了...)
還有一點,咱把樹狀陣列當做線段樹來康的話其實一切都會很清晰,這個來張四合一的圖:
第一張就是隨處可見的 sb 樹狀陣列剖析圖了
第二張咱把點補齊了一下,即每個點下面所有層都賦值乙份點,然後以第一張圖類似的規則連邊,同時某個點正下方的點也要向其連邊
第三張咱把點長補全了,看起來... 是不是很像線段樹了呢? 2333
然後第四張圖寫了一下某個點 update 時的虛擬狀況,某個點一直往上跑就好辣,至於 query 時,模擬線段樹查詢 1~x 內的資訊(也就是字首資訊嘛),把查詢點對應到這裡,不就變成了每次去掉乙個 lowbit 嘛
這樣,對於受眾較少的 oi 齡較大但對於樹狀陣列只是幾個模板的(指自己) oier 們來說,這篇博文的價值大部分就已經完成了...
那麼還有一小部分就是樹狀陣列(在理解了以上內容之後),在掃瞄線中的應用 ...
你可能已經在撓頭了??? 線段樹不是區間查詢搞的掃瞄線?? 什麼時候樹狀陣列也能來湊熱鬧了?
腦補一下,拆成兩個字首和可不就是區間嘛, 但其實,樹狀陣列不能艹掃瞄線 【霧 (就算能咱也不會啊 qwq)
不過在這裡,還有乙個另一種情況的(偽)掃瞄線可以用樹狀陣列優化二維字首和來做
詢問 單個矩陣 與 多個矩形(互不相交,劃重點) 的面積交之和 , 多組詢問 ,資瓷離線 ,要求複雜度乙隻 log ,並且略略卡常(雖說原題時限給了 10 s 就是了)
資料比較友好,不需要離散... (講道理可能 pj 的同學倒能一眼看出二維字首和,然後想著用 bit 優化??? 雖說還是很超綱就是了)
真 tm 好打,明明用線段樹維護的話會是個碼農題的說,用了樹狀陣列多在紙上比劃兩下就好了
//by judge
#include#define ll long long
#define rg register
#define pb push_back
#define p pair#define fi first
#define se second
#define fp(i,a,b) for(rg int i(a),i=(b)+1;ii;--i)
#define go(u) for(rg int i=head[u],v=e[i].to;i;v=e[i=e[i].nxt].to)
#define open(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
const int m=2e6+3;
typedef ll arr[m];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?eof:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
inline int read() char sr[1<<21],z[20];int ccf=-1,z;
inline void ot()
inline void print(ll x,char chr='\n') int n,m,w,l; ll ans[m]; vectorql[m],qr[m],op[m];
namespace bit
inline ll ask(int x,int l,int r)
} using namespace bit;
signed main() fp(i,1,m) print(ans[i],"\n "[i
}
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...
樹狀陣列 瞎bb 樹狀陣列
樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...
樹狀陣列 二維樹狀陣列模板
樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...