一些關於線段樹的操作記錄

2021-09-22 18:28:50 字數 2991 閱讀 4890

由於筆者本身總是弄不清楚線段樹的各種寫法之間的差異,故寫在這裡方便看懂題解

關於可持久化

關於各種玩意兒套線段樹

關於離散化

關於卡常

關於遞迴

關於權值線段樹

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 注意有乙個空格哦 這樣就...