線段樹單點更新hdu1166

2021-08-17 22:20:42 字數 1237 閱讀 7959

學習自

先序建子樹,然後回溯建立父節點

更新時先遞迴更新子節點,然後再回溯更新父節點

回溯思想很重要

#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國都掌握的一清二楚,每個工...