題目鏈結
線段樹的動態開點,簡單點說就是在心中構建好了一棵線段樹,需要訪問某個點的時候才標記,沒有訪問節點的統一設為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個整數...