P3372 模板 線段樹 1 動態開點

2021-10-19 08:12:42 字數 1627 閱讀 3968

題目鏈結

線段樹的動態開點,簡單點說就是在心中構建好了一棵線段樹,需要訪問某個點的時候才標記,沒有訪問節點的統一設為0,節約空間。

主要用於維護區間很大(比如權值線段樹),

或者資料需要離散化的時候也可以動態開點來省點**量。

#include

using

namespace std;

#define ll long long

const

int maxn =

1e5+7;

//線段樹維護區間和 涉及區間修改

ll tree[maxn<<2]

;//表示對應的區間和

ll tag[maxn<<2]

;//懶標記 表示當前區間的子區間還未被標記資訊更新 這裡是區間值的變動

int n,m;

int lc[maxn<<2]

,rc[maxn<<2]

;//動態開點

int root=

1,cnt=1;

//root用於傳引用,cnt記錄開點數目

inline

void

pushup

(int

&rt)

inline

void

updata_p

(int

&rt,

int l,

int r,

int x,

int v)

//單點更新

int mid=

(l+r)

>>1;

if(x<=mid)

updata_p

(lc[rt]

,l,mid,x,v)

;else

updata_p

(rc[rt]

,mid+

1,r,x,v)

;pushup

(rt);}

inline

void

pushdown

(int rt,

int l,

int r)

}inline

void

updata

(int

&rt,

int l,

int r,

int vl,

int vr,

int v)

//區間每個數加v

int mid=

(l+r)

>>1;

pushdown

(rt,l,r)

;updata

(lc[rt]

,l,mid,vl,vr,v)

;updata

(rc[rt]

,mid+

1,r,vl,vr,v)

;pushup

(rt);}

inline ll query

(int rt,

int l,

int r,

int vl,

int vr)

intmain()

int f,x,y,k;

while

(m--

)else

}return0;

}

P3372 模板 線段樹 1

線段樹學習 這個題來看,線段樹分為建樹,更新,查詢。1.建樹 void build ll p,ll l,ll r ll mid l r 1 build lson p l,mid build rson p mid 1,r push up sum p void push up sum ll p 這段 的...

P3372 模板 線段樹 1

題 include includeusing namespace std typedef long long ll ll n,m,ans,x,y,op,val 因為下面有的函式需要用到x,y,val值,懶得傳參,故直接寫為全域性變數 const int n 100000 struct nodetre...

P3372 模板 線段樹 1

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