演算法 線段樹

2022-06-03 08:30:12 字數 873 閱讀 2470

線段樹的根節點是整段區間,其它結點是由區間不斷二分得到的子區間,其中葉子結點是區間的每個單獨的元素。

這裡使用結構體存線段樹。

struct tree tree[4*maxn+2];//注意陣列大小至少要開到區間長度的四倍大
這裡預設我們要求的是區間和,故結點值均為區間和。

可以視情況改變結點值的含義。

void build(int left, int right, int index) 

int mid = (right + left) / 2;

build(left, mid, index * 2);

build(mid + 1, right, index * 2 + 1);

tree[index].value = tree[index * 2].value + tree[index * 2 + 1].value;

//不是葉子結點,則其值為左子樹加右子樹

}

如果每次對葉子結點的值進行修改時,總是一併將受其影響的其他父結點的值一起修改,耗時會比較長。

於是我們在接到修改命令之後,可以先將受到影響的最上層結點打上lazy標記,儲存要修改的值。等到查詢的時候,執行先前被延遲的修改操作,再將懶標記下放,從而達到向下層層修改的效果。如此一來可以節省很多時間。

void spread(int i) 

}

void change(int i, int x, int y, int z) 

else

}

int ask(int i, int x, int y) 

}

演算法 線段樹

幾次的省賽,成績都不是很理想。不過這幾次省賽的給我們留下了很多寶貴的經驗 首先發現的是線段樹,每考必有 今天我們學習的就是線段樹 線段樹的功能是 1 對一段數字進行累加。2 對數字進行搜尋。3 將包含在區間int的元素x插入到樹t中。4 從線段樹中刪除元素x。5 對線段樹上的資料進行更新。今天,我們...

演算法 線段樹 活動排期衝突問題

今天偶然遇到了乙個有點意思的問題,將它轉化成了題目,有點令人懷念 有一張活動排期表,表上有n組活動的排期。其中,每組活動都會開啟若干次,每個活動都有乙個唯一id和乙個開啟時間a,關閉時間b。同組活動不能在相同時間內開啟兩個及以上。如果同組活動同時開啟,則會產生衝突,活動開啟失敗。問 當前活動表內是否...

ccf除法 線段樹模板

這題的要求是對區間處理,查詢區間和,一看就是線段樹模板題,下面是 includeusing namespace std int pp 100001 struct qp 2000001 void build int l,int r,long long x 建樹函式 int m l r 2 build ...