模板 線段樹1

2021-10-24 07:01:37 字數 825 閱讀 8793

洛谷p3374

線段樹的結構與樹狀陣列相似,但線段樹更加通用,維護的資料只要滿足區間加即可。線段樹是一棵二叉樹,每個節點表示乙個區間。假設某個節點表示[l,r],mid=(l+r)/2,則它的左子節點表示[l,mid],右子節點表示[mid+1,r]。若乙個節點的編號為x,則它的左子節點編號為x*2,右子節點編號為x*2+1。儲存節點的陣列大小,通常為資料量的4倍。

線段樹的單點修改操作,只要將包含被修改元素的節點全部更新即可。

線段樹的區間查詢操作,只要一直遞迴,看當前節點表示的區間是否包含於被查區間,如果不是,再看被查區間是否與左/右子節點表示的區間有重合部分。

#include using namespace std;

const int maxn=5e5+5;

int n,m;

int a[maxn];

struct segment_treet[maxn<<2];

void build(int p,int l,int r) //p表示節點編號

int mid=(l+r)>>1;

build(p<<1,l,mid); build(p<<1|1,mid+1,r);

t[p].sum=t[p<<1].sum+t[p<<1|1].sum;

}void add(int p,int x,int k)

int ask(int p,int l,int r)

int main()

return 0;

}

模板 線段樹 1

區間修改 區間查詢 include define ll long long using namespace std ll a 100003 原數列 tree 400003 線段樹 delta 400003 標記 void update int now update多多益善 void build in...

線段樹模板(1)

本篇只對線段樹的基本應用介紹 即整區間單次改變,區間求和,單點改變和區間改變乙個道理,只把區間變成點。剩下的線段樹知識點類似 區間求逆序對,區間多次改變 同時 再 或者 或者 區間 合併,交 區間過大在改變時對p取模等放在後面學習給出。若只是需要求區間和或者單點改變,樹狀陣列是個好的選擇,但是其他的...

模板 線段樹 1

題目描述 如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作...