模板 線段樹 1

2021-07-27 03:25:19 字數 1293 閱讀 5671

區間修改+區間查詢

#include

#define ll long long

using

namespace

std;

ll a[100003],//原數列

tree[400003],//線段樹

delta[400003];//標記

void update(int now)

//update多多益善

void build(int now,int l,int r)

// 當前點編號 當前點左邊界 當前點右邊界

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

build(now<<1,l,mid);//遞迴建左兒子

build((now<<1)+1,mid+1,r);//遞迴建右兒子

update(now);//更新一下

}/*void point_change(int now,int l,int r,int x,int v)

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

if(x<=mid) point_change(now<<1,l,mid,x,v);

else point_change((now<<1)+1,mid+1,r,x,v);

update(now);

}*/void pushdown(int l,int r,int mid,int now)

//當前點左邊界 當前點右邊界 當前點左右兒子分界 當前點編號

}ll sum(int l,int r,int lrange,int rrange,int now)

//當前點左邊界 當前點右邊界 區間左邊界 區間右邊界 當前點編號

void change(int l,int r,int lrange,int rrange,int now,int v)

//當前點左邊界 當前點右邊界 區間左邊界 區間右邊界 當前點編號 修改值

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

pushdown(l,r,mid,now);//先下傳標記!

if(lrange<=mid)//左兒子上有需修改的部分

change(l,mid,lrange,rrange,now<<1,v);

if(rrange>mid)//右兒子上有需修改的部分

change(mid+1,r,lrange,rrange,(now<<1)+1,v);

update(now);//update多多益善

}int main()

else

}return

0;}

線段樹模板(1)

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

模板 線段樹 1

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

模板 線段樹1

洛谷p3374 線段樹的結構與樹狀陣列相似,但線段樹更加通用,維護的資料只要滿足區間加即可。線段樹是一棵二叉樹,每個節點表示乙個區間。假設某個節點表示 l,r mid l r 2,則它的左子節點表示 l,mid 右子節點表示 mid 1,r 若乙個節點的編號為x,則它的左子節點編號為x 2,右子節點...