樹狀陣列的操作(持續更新?)

2021-08-19 13:40:39 字數 1982 閱讀 3293

樹狀陣列感覺就是快速求字首和的資料結構。

以下記錄本人遇到的各種樹狀陣列模板題

單點修改,區間查詢

nyoj 116 士兵殺敵(二)

#include#define for(a,b,c) for(int a = b; a <= c; a++)

int tree[1000005];

int n, m;

int lowbit(int x)

int query(int pos)

void add(int pos, int num)

int main()

char s[10];

while(m--)

return 0;

}

區間修改,單點查詢

題目鏈結 nyoj  119  士兵殺敵(四)

#includelong long tree[1000005];

char s[10];

long long n;

long long lowbit(long long x)

void add(long long pos, long long num)

long long query(long long pos)

int main()

else

}return 0;

}

區間修改,區

間查詢

儲存內容發生些變化,區間修改還是和上面的相同

題目鏈結 luogu  p3372 【模板】線段樹 1

#include#define for(a,b,c) for(int a = b; a <= c; a++)

#define ll long long

ll n, m;

ll c1[100005], c2[100005];

ll lowbit(ll x)

void add(ll *v, ll pos, ll num)

ll prefix_sum(ll *v, ll pos)

ll sum(ll x)

ll query(ll l, ll r)

int main()

int flag;

ll l, r;

while(m--)

else

}return 0;

}

求逆序對個數

按左邊界從小到大排序,如果左邊界相等按右邊界從小到大(右邊界從小到大排,是防止多加左邊界相同時右邊界小的個數)

排完序後,按順序找每個點右邊界比它小的個數。

暴力點的按右邊桶排序,每次找前面有多少個。所以可以根據這個,使用樹狀陣列優化。o(1)+o(n)降為2o(logn)

題目鏈結 poj 3067 japan

#include#include#includeusing namespace std;

#define for(a,b,c) for(int a = b; a <= c; a++)

#define mem(a,b) memset(a,b,sizeof(a))

#define ll long long

ll tree[2005];

int n, m, k;

struct edge

e[1000005];

bool cmp(edge a, edge b)

int lowbit(int x)

void update(int pos)

ll query(int pos)

int main()

printf("test case %d: %lld\n",cnt++,ans);

}return 0;

}

樹狀陣列 區間更新

樹狀陣列天生用來動態維護陣列字首和,其特點是每次更新乙個元素的值,查詢只能查陣列的字首和,但這個題目求的是某一區間的陣列和,而且要支援批量更新某一區間內元素的值,怎麼辦呢?實際上,還是可以把問題轉化為求陣列的字首和。首先,看更新操作update s,t,d 把區間a s a t 都增加d,我們引入乙...

樹狀陣列操作

題意 序列 n 1e6 有 m n 個詢問,求 l 到 r 中有幾個不相同的數。題解 如果 n 的範圍為 1e5 就是莫隊裸題,但是由於 n 的範圍為 1e6 那麼就是可用樹狀陣列操作,具體就是可發現,只有最後出現的數字有價值,設 r 指標從左到右,如果出現了乙個數之前沒出現過,在樹狀陣列裡此位置 ...

git的基本操作(持續更新)

發現周圍的人,貌似都對git不太熟悉,當然包括我自己。於是乎,特意寫下此文,幫助自己更好地對git進行操作 一 什麼是git?這個,我不想多說,簡單而言,就是能幫助你進行版本控制,記錄你的歷史提交記錄,還可以回滾,反正具有很強的實用性 二 git的基本操作 1.git clone 轉殖專案到本地。2...