洛谷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個整數,表示乙個操作...