普通版本的線段樹進行的是單點更新和區間查詢. 對於帶有懶惰標記的線段樹, 則可以進行區間更新.
代表了這個結點的值已經被更新過了, 但是沒有進行子樹的結點值更改操作, 用lazy陣列標記一下.
所以, 每次進行值的更新和查詢操作, 每到乙個有 lazy 標記的結點, 必須進行向下更新.
//區間替換
#include #include #include #include #include #define max(a,b) (a>b)?a:b
#define min(a,b) (a>b)?b:a
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define ll long long
const int maxn = 100100;
using namespace std;
int lazy[maxn<<2];
int sum[maxn<<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);
}void update(int l,int r,int 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 (r > m) update(l , r , c , rson);
pushup(rt);
}ll query(int l,int r,int l,int r,int rt)
pushdown(rt , r - l + 1);
int m = (l + r) >> 1;
ll ret = 0;
if (l <= m) ret += query(l , r , lson);
if (m < r) ret += query(l , r , rson);
return ret;
}int main()
else if(str[0]=='q')
}} return 0;
}
hdu 1698 線段樹區間更新 懶惰標記
題意 給n個鉤子,每次都會更新從x到y這個範圍的鉤子價值,最後求鉤子的總價值。初始的鉤子價值為1.直接暴力求解是會超時,需要有線段樹懶惰標記維護資料。線段樹的懶惰標記,直接記錄了在x到y之間的資料,這樣可以減少遞迴總數。1 include2 include3 using namespace std ...
線段樹 的單點更新和區間求和
include int sum 100 void build int lift,int right,int rt void updata int point,int add,int lift,int right,int rt int query int l,int r,int l,int r,int...
模板 線段樹 (線段樹的懶惰標記)
如題,已知乙個數列,你需要進行下面兩種操作 將某區間每乙個數加上 k。求出某區間每乙個數的和。第一行包含兩個整數 n,m,分別表示該數列數字的個數和操作的總個數。第二行包含 n 個用空格分隔的整數,其中第 i個數字表示數列第 i項的初始值。接下來 m行每行包含 33 或 44 個整數,表示乙個操作,...