題意: 略
分析: 可設一另設兩個域sum 和d分別表示該區間的當前和與該區間的每個元素的增量,之後維護線段樹即可! 再次感慨**能力、、、、
#include using namespace std;
__int64 sum1;
int a[100005];
struct node
tree[1000000];
void creat (int root, int left, int right)
int mid = (left+right)/2;
creat(2*root, left,mid);
creat(2*root+1, mid+1, right);
tree[root].sum = tree[2*root].sum + tree[2*root+1].sum;
}void insert (int root, int left, int right, int x)
tree[root].sum += x*(right -left+1);
int mid = (tree[root].left+ tree[root].right)/2;
if (left > mid)
insert(2*root+1,left, right, x);
else if (right <= mid)
insert(2*root, left, right, x);
else }
void search(int root, int left, int right)
if (tree[root].d)
int mid = (tree[root].left + tree[root].right)/2;
if (left > mid)
search(2*root+1, left, right);
else if (right <= mid)
search(2*root,left, right);
else }
void print(int root)
printf ("%d %d %i64d\n", tree[root].left , tree[root].right , tree[root].sum);
print(2*root);
print(2*root+1);
}int main ()
insert (1, l, r, x);
}else
sum1 = 0;
search(1, l, r);
printf ("%i64d\n",sum1);}}
return 0;
}
POJ 3468 線段樹成段更新
題意就是給了一串行的數.然後不斷的問一段的值或者在一段上每個數加乙個數.輸出每次詢問的值.初看這題感覺就是最一般的線段樹成段更新的應用.但下手後發現很多細節.對於一向很粗心的我調了很久才給調出來.成段更新前一文已經提到過.這裡再通過這一題補充一些很值得注意的地方 1 前乙個題因為只有最後才要輸出一段...
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...