學習自
先序建子樹,然後回溯建立父節點
更新時先遞迴更新子節點,然後再回溯更新父節點
回溯思想很重要
#include using namespace std;
const int maxn = 50005;
int sum[maxn<<2];
void build(int l, int r, int rt);
void pushup(int rt);
int query(int l, int r, int l, int r, int rt);
void update(int p, int add, int l, int r, int rt);
void update(int p, int add, int l, int r, int rt);
int main()
else if(op[0] == 's') update(a, -b, 1, n, 1);
else update(a, b, 1, n, 1);}}
return 0;
}void update(int p, int add, int l, int r, int rt)
int mid = (l + r)>>1;
if(p <= mid) update(p, add, l, mid, rt<<1); //若p在左子樹里,就只更新左子樹
else update(p, add, mid + 1, r, rt<<1|1); //若p在右子樹里,就只更新右子樹
pushup(rt);
}int query(int l, int r, int l, int r, int rt) //前兩個變數大寫const值,表示查詢的區間;後三個變數繫結,表示當前節點的區間和序號
void pushup(int rt)
void build(int l, int r, int rt) //原始陣列的左端點,原始陣列的右端點,節點序號
int mid = (l + r)>>1;
build(l, mid, rt<<1);
build(mid + 1, r, rt<<1|1);
pushup(rt); //回溯更新父節點
}
HDU 1166 線段樹單點更新
c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...
HDU1166 線段樹區間求和,單點更新
problem description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的...
HDU1166 敵兵布陣 線段樹 單點更新
description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工...