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