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