poj 3468 區間更新or求和

2021-07-25 09:51:15 字數 1255 閱讀 3408

problem:

給乙個陣列,多次更新一段區間的值,或者查詢一段區間的和。

solutioin:

利用線段樹實現高效的反覆查詢的工作。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ms(s) memset(s,0,sizeof(s))

typedef

unsigned

long

long ull;

typedef

long

long ll;

const

double pi = 3.141592653589;

const

int inf = 0x3fffffff;

#define maxn 100000

struct node

};node tree[maxn*4];

ll value[maxn+10];

//初始化樹,根節點是1

void init_tree(int root, int l, int r)

else

}//查詢和

ll query_tree(int root, int l, int r)

else

if(r <= m)

return query_tree(2*root, l, r);

else

return query_tree(2*root, l, m) + query_tree(2*root+1, m+1, r);

}}void update_tree(int root, int l, int r, ll v)

else

if(r <= m)

update_tree(2*root, l, r, v);

else

}}int main()

else

}return

0;}

POJ 3468 線段樹(成段更新,區間求和)

這個線段樹運用了應用了add域優化,每個節點除了用value記錄當前節點對應區間元素的和之外,還要用add域記錄當前節點對應區間每個元素的增量。這樣,沒必要每次更新都要更新value更新到最底層每乙個點,只需要將增量記錄在某父節點的add域中即可,如果下次查詢或者更新操作的是該父節點對應區間的子區間...

POJ 3468 線段樹區間修改,區間求和

由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了tree root val tree l root val tree r root val 但是我們為了把懶標記打上,當節點表示的區間是完全被詢問區間包含,那麼這個區間的資訊都是有用的,因此我們其實只需要把這個節點更新,並打...

poj 3468 樹狀陣列 區間修改 區間求和

這是利用樹狀陣列進行 區間求和區間修改,寫起來比線段樹輕鬆許多,具體的原理參考大佬部落格 如下 1 2 poj 3468 樹狀陣列 區間修改 和 區間查詢 3原理 4c1 和 c2 是兩個差分陣列,所以輸入資料時 c1 i a i a i 1 56 7 include 8 include 9 inc...