樹狀陣列入門

2021-07-03 15:46:14 字數 1310 閱讀 1966

用office做了一張pdf - -

這是一維的情形,如果是二維,可以把每一行的一維樹狀陣列看成乙個節點,然後再把二維樹狀陣列看成一維樹狀陣列。

好文章:

兩道入門題:

對於第一題hdu1556:

題意:初始陣列元素值都為0,給定區間[x,y],將區間[x,y]每個元素的值+1,最後輸出整個陣列每個元素的值。

更新區間[x,y]的話,可以只更新兩個點x,y+1(將所有管轄x的管轄點+1,所有管轄y+1的管轄點-1)

查詢點p,將p管轄的區間的值加起來就行了。

**:

#include #include #include using namespace std;

int a[100005],n;

int lowbit(int x)

void update(int x,int v)

}int query(int x)

return ret;

}int main()

for(i=1;i這題不是邊更新邊查詢,所以可以用更簡單的方法做。由於是更新完再查詢,可以在每次更新的時候將兩個端點標記一下,左後再統一更新一遍就行了。

**:

#include #include #include using namespace std;

int s[100005];

int main()

for(i=n-1;i>=1;i--)

s[i]+=s[i+1];

for(i=1;i對於第二題poj2155:

題意:給定乙個n*n的矩陣,矩陣上每個元素的初始值為0,有兩種操作①給出乙個子矩陣(左上角和右下角的座標),將子矩陣的每個元素的值取反②查詢乙個元素的值

由於每次查詢的答案只有0和1,可以統計每個元素被修改過多少次,如果為奇數次那麼答案為1,否則為0。修改和查詢幾乎和上面那題一樣,只是多了一維。

**:#include #include using namespace std;

int n,a[1006][1006];

void clear()

int lowbit(int x)

void update(int x,int y,int v)

int query(int x,int y)

int main()

else

}printf("\n");

} return 0;

}

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 入門

樹狀陣列,乙個用來區間求和修改都為log n 的演算法。在網上資料很多,看起來也不是很難,學習一下!基本上學習樹狀陣列都會看到下面這個圖,這也是最基本的乙個圖,看懂這個以後,對樹狀陣列也就會有 一定的了解了。令這棵樹的結點編號為c1,c2.cn。令每個結點的值為這棵子樹的值的總和,那麼容易發現 c1...

樹狀陣列入門

樹狀陣列 模板 include include includeusing namespace std const int maxn 1e6 10 int c maxn int lowbits int x void update int x,int y,int n int getsum int x r...