樹的區間查詢與更新(線段樹)

2021-06-08 16:19:46 字數 964 閱讀 3542

原題:

#include #include #include #include #include #include #include #include using namespace std;

#define clr(x) memset(x,0,sizeof(x))

#define ll long long

#define typec double

#define lson l , m , rt << 1

#define rson m+1 , r , rt << 1 | 1

const int n = 100000;

ll add[n<<2];

ll sum[n<<2];

void pushup(int rt)

void pushdown(int rt,int m)

}void build(int l,int r,int rt)

int m=(l + r)>>1;

build(lson);

build(rson);

pushup(rt);

}ll ans[n];

void output(int l,int r,int rt)

pushdown(rt,r-l+1);

int m=(l+r)>>1;

output(lson);

output(rson);

pushup(rt);

}void update(int l ,int r,ll c,int l,int r,int rt)

pushdown(rt,r-l+1);

int m=(l + r)>>1;

if (l<=m) update(l,r,c,lson);

if (m>1;

ll ret=0;

if (l<=m) ret+=query(l,r,lson);

if (m

區間更新,線段樹

對 l,r 進行區間更新 1 如果結點的區間被查詢區間 l,r 覆蓋,僅對該結點進行更新,並做懶標記,表示該結點被更新過,對該結點的子結點不再進行更新 2 判斷在左子樹查詢,右子樹查詢。查詢過程中,若當前節點帶有懶標記,懶標記下傳給子結點 當前結點懶標記清除,子結點更新並做懶標記 繼續查詢 3 更新...

線段樹之區間更新線段樹

在學習區間更新線段樹之間要先學習單點更新線段樹。情景引入 給乙個長度為n的陣列a,隨機修改區間陣列元素 a l a r 的值,然後求任意區間和。修改操作我們可以想到 for int i l i r i update 但是,這種方法很顯然比較費時,不夠優,所以有了今天要講的區間更新。懶惰標記 在講之前...

點更新線段樹模板

對一列數,對每次詢問輸出對應區間的和,每次修改只修改乙個數的值。定義 struct tree 由於線段樹還是相對比較平衡的,所以可以使用陣列t來儲存這棵樹,對與某個節點i,t i 2 就是左子樹,t i 2 1 就是右子樹 建樹 線段樹的思想是每個節點記錄區間的資訊,某點區間1 n,則1 n 2為其...