POJ 3468 線段樹成段更新

2021-05-27 15:11:18 字數 1289 閱讀 3454

題意就是給了一串行的數...然後不斷的問一段的值或者在一段上每個數加乙個數...輸出每次詢問的值....

初看這題感覺就是最一般的線段樹成段更新的應用...但下手後發現很多細節...對於一向很粗心的我調了很久才給調出來...成段更新前一文已經提到過..這裡再通過這一題補充一些很值得注意的地方:

1、前乙個題因為只有最後才要輸出一段的總和...所以省去了getsum的過程...這一題寫的時候getsum就寫出了錯誤...充分理解了成段更新線段樹的原理後...能知道只要訪問到了乙個點..不論是更新的時候還是求和的時候訪問到...都應該有pushdown...將值給推下去....一定要注意...

2、這一題和上一題不同的是不是將一段數變為一段另外的數...而是將一段數的每個數加上乙個數..這裡的話很多地方就不是「=」了..而是"+="...col更新..sum除了sum=sum左+sum(右)..其餘都是+=進行更新...

3、資料範圍...要注意一段的合會爆int的...所以有幾個地方要用long long來處理...

program :

#includeusing namespace std;

long long sum[400001],col[400001],k;

int n,q,a,b;

char c;

void build(int l,int r,long long sp)

int mid=(l+r)/2;

build(l,mid,sp*2);

build(mid+1,r,sp*2+1);

sum[sp]=sum[sp*2]+sum[sp*2+1];

}void pushdown(int sp,long long m) }

void update(int l,int r,long long data,int l,int r,int sp)

pushdown(sp,r-l+1);

int mid=(l+r)/2;

if (mid>=l) update(l,r,data,l,mid,sp*2);

if (mid< r) update(l,r,data,mid+1,r,sp*2+1);

sum[sp]=sum[sp*2]+sum[sp*2+1];

}long long getsum(int l,int r,int l,int r,int sp)

int main()

else printf("%i64d\n",getsum(a,b,1,n,1));

}

return 0;

}

POJ 3468 線段樹成段更新

很久以前的題目再做一遍複習一下。要點 1 約定在任何時候 add num 到達節點的時候就立即更新節點的 sum 值。2 每次更新節點回溯的時候記得維護節點的 sum 值。3 執行詢問操作的時候,遇到 lazy 標記為1 的時候往下 push down,同時記得第一點 4 遇到符合要求的詢問區間時,...

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...