POJ 3468 線段樹成段更新

2021-06-18 00:54:24 字數 1259 閱讀 1446

很久以前的題目再做一遍複習一下。

要點:1)約定在任何時候 add_num 到達節點的時候就立即更新節點的 sum 值。

2)每次更新節點回溯的時候記得維護節點的 sum 值。

3)執行詢問操作的時候,遇到 lazy 標記為1 的時候往下 push_down,,同時記得第一點

4)遇到符合要求的詢問區間時,由於第一條的規定,直接返回 sum 值,而不必加上 區間長度*add_num

好了,以前由於不知道什麼時候返回sun 值 和 什麼時候加上 區間長度*add_num犯糊塗,加上了第一條的約定,這樣就比較明朗了

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 100020;

struct node

p[maxn<<2];

int a[maxn];

int n,m;

bool init()

void build(int ic,int l,int r)

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

build(ic<<1,l,mid);

build(ic<<1|1,mid+1,r);

p[ic].sum=p[ic<<1].sum+p[ic<<1|1].sum;

}void push_down(int ic)

void update(int ic,int l_up,int r_up,int add_num)

if(p[ic].lazy)push_down(ic);

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

if(l_up>mid)update(ic<<1|1,l_up,r_up,add_num);

else if(r_up<=mid)update(ic<<1,l_up,r_up,add_num);

else

int lc = ic<<1;

int rc = ic<<1|1;

p[ic].sum=p[lc].sum+p[rc].sum;

}void add()

ll do_query(int ic,int ql,int qr)

if(p[ic].lazy)push_down(ic);

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

if(qr<=mid)return do_query(ic<<1,ql,qr);

else if(mid

POJ 3468 線段樹成段更新

題意就是給了一串行的數.然後不斷的問一段的值或者在一段上每個數加乙個數.輸出每次詢問的值.初看這題感覺就是最一般的線段樹成段更新的應用.但下手後發現很多細節.對於一向很粗心的我調了很久才給調出來.成段更新前一文已經提到過.這裡再通過這一題補充一些很值得注意的地方 1 前乙個題因為只有最後才要輸出一段...

poj 3468線段樹 成段更新

題意和題目都很簡單,就是線段樹的成段更新,只要做一下延遲標記就好了。題意 查詢一段數的和,和更新一段數的值。一開始出了點錯誤,忘在更新時做延遲標記了。includelong long sum 100010 2 long long add 100010 2 void push up int rt vo...

poj3468 線段樹成段更新模板

include include include include include using namespace std define lson l,m,rt 1 define rson m 1,r,rt 1 1 define clear a memset a,0,sizeof a const int...