線段樹學習總結
這個星期主要是進行線段樹的複習與進一步學習,做了些題目,將我的錯誤與注意事項總結在此。
在這次的學習中,我才算是基本會使用了線段樹,不再像以前,只能當做一種幫忙整段修改區間,求解區間最大值的資料結構,線段樹的優越就在於它的樹形結構,將任何操作都降到了log級別的,在此基礎上可以記錄很多資料,而並非只有節點的值。
我的線段樹習慣如下:
此種寫法參考了
1, 用root表示當前節點,不記錄節點區間,而是在遞迴過程中隨著函式的改變自動更新。
2, pushup() 是把當前結點的資訊更新到父結點
3, pushdown()是把當前結點的資訊更新給子節點
4, 要更改的區間用全域性變數x,y記錄下,不在遞迴的過程中傳遞
做了些題目,將其中2道說下 :
poj 3468
成段增減,區間求和問題
要注意的資料範圍,要使用longlong來儲存,另外需要注意的是用scanf()讀入long long的時候還是要用「%i64d」,因為會有負數的出現,在正整數的int範圍內使用什麼都無所謂。
下邊是部分的**
poj 3468過程
1poj 3667//更新結點資訊,即加減處理
2void updata(int l,int r,int
root)312
13int mid=(l+r)/2;14
//必須是臨時變數,避免遞迴時改變
1516
//left child
17 a[root*2][0]+=a[root][1]*(mid-l+1
); 18 a[root*2][1]+=a[root][1
];19
//right child
20 a[root*2+1][0]+=a[root][1]*(r-mid);
21 a[root*2+1][1]+=a[root][1
];22
//itself
23 a[root][1]=0;24
25 updata(l,mid,root*2
);26 updata(mid+1,r,root*2+1
);27
//change max
28 a[root][0]=a[root*2][0]+a[root*2+1][0
];29}30
31//
尋找區間累加和
32int find(int l,int r,int
root)
33
要求解的是尋找長度為len的最靠左邊的一段區間,將其佔據,或者將一段長度的區間釋放。
這次線段樹要記錄的就不是結點的值了,而是區間內的一些特殊的值,如下所示
1cover域的數字,0表示全為空的,1表示全被佔了,-1為其他情況,具體的思路見**注釋struct
tree
2 a[maxn*4];
poj 3667
#include #include學到最後,感想就是線段樹就是乙個log級別的資料結構,跟區間有關的很多值都可以記錄下來然後進行高效的操作,總的來說,就是分成兩個操作,修改和查詢,具體的區別根據實際的需要我們可以進行具體操作,我學到的可以進行【單點更新,成段更新,區間合併,掃瞄線】,遇到這類的資料結構,首先要考慮能不能使用線段樹求解了。#include
using
namespace
std;
const
int maxn=80100
;struct
tree
a[maxn*4
];int
n,m,color,len,x,y;
//初始化,每段空房間數為r-l+1
void build(int l,int r,int
root)
void pushdown(int l,int r,int
root)
}//updata father
void pushup(int l,int r,int
root)
void updata(int l,int r,int
root)
pushdown(l,r,root);
int mid = (l+r)/2
; updata(l,mid,root*2
); updata(mid+1,r,root*2+1
);
pushup(l,r,root);
}int query(int l,int r,int
root)
intmain()
else
}fclose(stdin); fclose(stdout);
return0;
}
線段樹學習筆記
線段樹是一種 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o logn 而未優化的 空間複雜度 為2n,因此有時需要離散化讓空間壓縮。以下筆記摘自lcomyn神犇部落格 1....
線段樹學習筆記
本文筆記在參考一步一步理解線段樹 tenos的基礎上形成 線段樹,也是二叉搜尋樹的一種,是基於陣列,但是優於陣列的一種資料結構。同時結合預處理 時間複雜度一般在o n 使得從原來陣列的o n 的查詢和更新複雜度降到了o logn 在處理很大資料量的資料更新和查詢最值方面變得簡單,值得一提的是,它的構...
線段樹學習筆記
線段樹是一種維護區間的資料結構,且滿足二叉樹的全部性質 下圖是一棵維護區間 1 6 1,6 的線段樹 格式 idl ri dl r我們可以發現,對於每個節點 k k 來說,其左節點編號為2k role presentation style position relative 2k2 k,右節點編號為...