由於筆者本身總是弄不清楚線段樹的各種寫法之間的差異,故寫在這裡方便看懂題解
關於可持久化
關於各種玩意兒套線段樹
關於離散化
關於卡常
關於遞迴
關於權值線段樹
1.分三種情況遞迴的
完全在左子樹,完全在右子樹,和兩邊都有的
複雜度證明:
兩邊都有的情況顯然只會出現一次,而樹高為log
(n
)log(n)
log(n)
,所以最壞2lo
g(n)
2log(n)
2log(n
),忽略常數後o(l
ogn)
o(log n)
o(logn
)
#define lson k<<1
#define rson k<<1|1
inline
void
updata
(int k,
int l,
int r,
int ql,
int qr)
int mid=l+r>>1;
各種下傳標記;
if(qr<=mid)
updata
(lson,l,mid,ql,qr)
;//完全在左邊
else
if(ql>mid)
updata
(rson,mid+
1,r,ql,qr)
;//完全在右邊
else
updata
(lson,l,mid,ql,mid)
,updata
(rson,mid+
1,r,mid+
1,qr)
; 各種上傳維護;
}
2.分兩種情況遞迴的
左子樹中有答案,右子樹中有答案
複雜度證明:顯然o(l
ogn)
o(logn)
o(logn
)。。。
#define lson k<<1
#define rson k<<1|1
inline
void
updata
(int k,
int l,
int r,
int ql,
int qr)
int mid=l+r>>1;
各種下傳標記;
if(ql<=mid)
updata
(lson,l,mid,ql,qr)
;//左子樹有
if(qr>mid)
updata
(rson,mid+
1,r,ql,qr)
;//右子樹有
各種上傳維護;
}
動態開log
loglo
g的鏈,注意遞迴左右子樹的遞迴的是rtrt
rt陣列以區間k
kk大值為例
靜態的直接開一棵主席樹,用字首和維護即可
單點修改的話可以用樹狀陣列維護字首和,注意最好主席樹套在裡面
區間修改也可以用樹狀陣列再做差分,但實現太過複雜,最好用線段樹套主席樹
注意資料範圍,如果不能保證數字在一定範圍內最好離散化,可以省很多空間
快輸快讀都用上,如果這還不夠的話可以寫標記持久化
關於標記持久化
就是一種如何將不用下傳laz
ylazy
lazy
的東西
就是修改時一路更改被影響到的點,詢問時則一路累加路上的標記,從而省去下傳標記的操作。get
it
get\ it
getit?
某些時候的每次詢問的遞迴邊界都是一定的,此時你可以這樣子定義
inline
intupdata
(int k,
int ql,
int qr,l=
1,r=n)
int mid=l+r>>1;
if(ql<=mid)
updata
(lson,ql,qr,l,mid);if
(qr>mid)updata
(rson,ql,qr,mid+
1,r)
;}
然後遞迴的時候就可以直接
updata
(rt[k]
,ql,qr)
;
單點修改有兩種遞迴方式
d at
a1
data 1
data1
到達葉子節點賦值,然後用線段樹的方法向上維護
inline
void
add(
int x,
int l=1,
int r=maxn,
int k=1)
int mid=l+r>>1;
if(x<=mid)
add(x,l,mid,lson)
;else
add(x,mid+
1,r,rson)
; sum[k]
=sum[lson]
+sum[rson]
; prosum[k]
=prosum[lson]
+prosum[rson]
;return
;}
d at
a2
data 2
data2
直接一路賦值下去
inline
void
add(
int x,
int d,
int l=0,
int r=maxn,
int k=1)
關於iframe的一些操作記錄
本文作為自己對iframe的乙個操作總結,做下簡單的記錄,希望能給大家帶來收穫,頁面使用了jquery 當然iframe要有訪問的許可權才行,即同源 假如index頁面包含乙個id為 iframe的 iframe,下文中所提及的iframe變數均為dom物件,jquery物件轉dom物件可以使用 0...
關於Linux環境操作的一些記錄
使用 ctrl backspace退位,或者shift backspacebin startup.sh tail f log catalina.out less n catalina.out free 預設單位是kb free m mb作為單位展示 free g gb作為單位展示 free h 以你...
關於mac的一些常用操作記錄
之前記錄過乙個關於mac遠端連線window機,實現共享檔案的記錄,今天記錄一些常用的操作,會持續更新。1.谷歌瀏覽器 f12的操作 command option i 開啟除錯面板 2.開啟指定位置的資料夾 copt path 開啟命令列 cd 你的path 然後 open 注意有乙個空格哦 這樣就...