通常情況下,樹狀陣列可用來處理單點修改,區間查詢。通過字首和的轉換,可以使其處理區間修改和單點查詢。
考慮原陣列和字首和陣列:
修改原陣列的某個點(i) 等價於 修改字首和陣列 的一條線段(1~i 都要修改)
查詢原陣列的某條線段(1~i) 等價於 查詢字首和陣列的乙個點(i)
這樣,適當地處理字首和陣列和原陣列,就可以轉化兩種問題。
通常情況下,對於a,我們會計算其字首和陣列b,但為了轉化問題,也可以把a看做b的字首和陣列。(這裡運用bit時就出現了所謂的 「 字首和的字首和 「)
附上樹狀陣列的模板:單點修改,區間查詢
一維(標準)
#define lowbit(i) ((i)&(-i))多維(擴充套件)struct
bit
void add(int x,int
val)
};
#define lowbit(i) ((i)&(-i))struct
bit
void add(int x,int y,int
val)
};
使用時不要忘記初始化。初始化的方法就是把每個點都插入一遍。
還要注意bit查詢時的返回值是字首和。
字首 樹狀陣列
具體見 1 include 2 using namespace std 3 typedef long long ll 4 const int maxn 1e5 10 5 const int mod 1e9 7 6 define rep i,first,second for int i first i...
hdu 5147 樹狀陣列 字首和
題目 題目分析 要保證兩對數滿足前面的大於後面的,第一對數的下標中較大的小於第二對數中下標較大的,那麼我們可以利用字首和和字尾和的思想,先預處理算出每乙個數的字首中比它小的數的個數,再計算出字尾中比它大的個數,利用樹狀陣列可以快速求取,然後對前面的數取字首和,也就是以它為較大數的所有數對的個數,列舉...
字首和 差分 樹狀陣列 線段樹
字首和 應用 區間查詢,不涉及數的變化。求區間 l,r d的和 一維字首和 s i a 1 a 2 a i s i s i 1 a i 二維字首和 s i j 第 i 行第 j 列格仔左上部分所有元素的和 以 x1,y1 為左上角,x2,y2 為右下角 s x2,y2 s x2,y1 1 s x1 ...