樹狀陣列感覺就是快速求字首和的資料結構。
以下記錄本人遇到的各種樹狀陣列模板題
單點修改,區間查詢
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...