如果有錯誤,歡迎大神指出!!
線段樹(模板):
線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。
對於線段樹中的每乙個非葉子節點[a,b],它的左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2+1,b]。因此線段樹是平衡二叉樹,最後的子節點數目為n,即整個線段區間的長度。
使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。而未優化的空間複雜度為2n,因此有時需要離散化讓空間壓縮。
線段樹有很多模板,而且基本上每道題都是稍稍改動或者根本不需改動就可以直接使用線段樹的模板,這裡提供幾個相對簡潔的模板:
(找了一些模板,來自於哈工大acm書)
//單點替換、單點增減、區間求和、區間最值
#include #include using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 222222;
int max[maxn<<2];
int min[maxn<<2];
int sum[maxn<<2];
int max(int a,int b)
int min(int a,int b)
void update(int p,int tihuan,int l,int r,int rt)
int m = (l + r) >> 1;
if (p <= m) update(p , tihuan ,lson);
else update(p , tihuan , rson);
pushup(rt);
}void update1(int p,int add,int l,int r,int rt)
int m = (l + r) >> 1;
if (p <= m) update1(p , add ,lson);
else update1(p , add , rson);
pushup(rt);
}int query(int l,int r,int l,int r,int rt)
int m = (l + r) >> 1;
int ret = -1;
if (l <= m) ret = max(ret , query(l , r , lson));
if (r > m) ret = max(ret , query(l , r , rson));
return ret;
}int query1(int l,int r,int l,int r,int rt)
int m = (l + r) >> 1;
int ret = 99999;
if (l <= m) ret = min(ret , query1(l , r , lson));
if (r > m) ret = min(ret , query1(l , r , rson));
return ret;
}int queryhe(int l,int r,int l,int r,int rt)
int m = (l + r) >> 1;
int ret = 0;
if (l <= m) ret += queryhe(l , r , lson);
if (r > m) ret += queryhe(l , r , rson);
return ret;
}int main()
else if(op[0]=='u') //單點替換
update(a , b , 1 , n , 1);
else if(op[0]=='m')//區間求最小
else if(op[0]=='h')//區間求和
else if(op[0]=='s')//單點增加
else if(op[0]=='e')//單點減少
}} return 0;
}
建樹是乙個關鍵(如圖):
對於乙個父節點 i 來說,那麼它的子節點2*i(左),2*i+1(右)。
線段樹單點更新
hdu 1166 單點更新,求區間和 第一次寫線段樹,照著大神的抄了一遍 include include include define max 50100 define mid l r 1 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using nam...
線段樹(單點更新)
1.hdu 1166 敵兵布陣 單點更新,區間求和,最裸的線段樹 include include include using namespace std define maxn 50010 define lson l,m,rt 1 define rson m 1,r,rt 1 1 struct tr...
線段樹單點更新
g 梔子花開 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 1921 description 這是乙個梔子花開的季節,也是乙個離別的季節,四年一千多個日日夜夜,那校園...