線段樹:
一:建樹//開始建樹的時候為built(1,1,n)
void built(int rt int l,int r)//rt為結點,初始值為1,l,r分別為左右端點
二:單點查詢
void query(int rt,int p)//初始結點值為1
三:單點修改
void add(int rt,int p,int val)
int mid=tree[rt].l+tree[rt].r>>1;
if(p<=mid)
add(rt<<1,p,val);
else add(rt<<1|1,p,val);
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1.sum];//單點修改與其相關的節點都要改變
}四:區間查詢
int ask(int rt,int l,int r)
五:區間修改
樹狀陣列:(求字首和簡單方便)
原碼:正數的原碼為其本身,負數的原碼 第一位符號為為1,剩餘的與正數的剩餘位數相同。
反碼:正數的反碼為其本身,負數的反碼為在原碼的基礎上符號位不變,剩餘位數取反。
補碼:正數的補碼為其本身,負數的補碼為在反碼的基礎上加1。
lowerbit()函式:(求二進位制下的x的第一位為1的數是第幾位,如:lowerbit(3)=1,3的二進位制為11,lowerbit(6)=2,6的二進位制為110)
int lowerbit(int x)
c[1]=a[1]; lowerbit(1)=1;
c[2]=a[1]+a[2]; lowerbit(2)=2;
c[3]=a[3]; lowerbit(3)=1;
c[4]=a[1]+a[2]+a[3]+a[4]; lowerbit(4)=4;
ask函式:(詢問區間[1,x]的和):
int ask(int x)
return ans;
}add函式:
void add(int x,int k)
}樹狀陣列模板題(hdu1166)
#include
#include
#include
using namespace std;
int t,n,a[100005],b[100005],m[100005],v=0;
char ch[9];
int l,r;
int lowerbit(int x)
int ask(int x)
return ans;
}void add(int x,int k)
}void add1(int x,int k)
}int main()
if(ch[0] == 『a』)
if(ch[0]==『s』)
cin>>ch;
}cout<<「case 「 }return 0; } c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生... 區間修改 區間求和 logn const int n 1e5 5 int a n namespace seg c n 2 void pushdown int k,int l,int r void pushup int k l,r是總區間 left,right是查詢區間 long long query... 樹狀陣列 主席樹 包括無修改和可修改。用乙個滿二叉樹 葉子節點可以為空 來維護乙個連續陣列,整個樹的所有葉子節點從左到右表示整個陣列,每個非葉子節點表示其所有葉子的集合所描述的乙個連續子陣列的某一特性 最小值,最大值等 可以在logn的複雜度內實現對任意連續欄位的給定特性的查詢 最小值等 可以在lo...A 敵兵布陣 樹狀陣列 線段樹模板
線段樹 樹狀陣列 ST表 模板
線段樹,樹狀陣列,主席樹