動態區間最值(RMQ) 線段樹

2021-10-06 22:17:24 字數 3993 閱讀 4582

建樹

a

aa陣列為初始陣列,tre

etree

tree

陣列為樹

typedef long

long ll;

const

int inf =

0x7fffffff

;const

int maxn =

2e5+10;

int a[maxn]

;int tree[maxn <<2]

, lz[maxn <<2]

;

建樹函式

和普通線段樹唯一的區別就是更新時取左右子樹的最值

void

build

(int i,

int l,

int r)

int mid =

(l + r)

>>

1, k = i <<1;

build

(k, l, mid)

;build

(k |

1, mid +

1, r)

; tree[i]

=max

(tree[k]

, tree[k |1]

);}

單點修改

函式功能:將位置x

xx的值修改為yyy

因為沒有用結構體儲存區間的左右邊界l,r

l,rl,

r,因此需要傳入修改的總區間[l,

r]=[

1,n]

[l,r] = [1,n]

[l,r]=

[1,n

]

void

update

(int i,

int l,

int r,

int x,

int y)

int mid =

(l + r)

>>

1, k = i <<1;

if(x <= mid)

update

(k, l, mid, x, y)

;else

update

(k |

1, mid +

1, r, x, y)

; tree[i]

=max

(tree[k]

, tree[k |1]

);}

區間加法

懶惰標記

使用陣列lzlz

lz記錄向子區間都加的值,pus

hdow

npushdown

pushdo

wn時只需要將子節點的值和標記都加上父節點的標記,然後清空父節點的標記。

void

pushdown

(int i)

}

區間加法

將區間[x,

y]

[x,y]

[x,y

]都加上val

valva

l。

void

add(

int i,

int l,

int r,

int x,

int y,

int val)

pushdown

(i);

int mid =

(l + r)

>>

1, k = i <<1;

if(x > mid)

add(k |

1, mid +

1, r, x, y, val)

;else

if(y <= mid)

add(k, l, mid, x, y, val)

;else

add(k, l, mid, x, mid, val)

,add

(k |

1, mid +

1, r, mid +

1, y, val)

; tree[i]

=max

(tree[k]

, tree[k |1]

);}

區間查詢

函式功能:查詢區間[x,

y]

[x,y]

[x,y

]的最值。

有三種情況:

int

query

(int i,

int l,

int r,

int x,

int y)

簡單模板
typedef long

long ll;

const

int inf =

0x7fffffff

;const

int maxn =

2e5+10;

int a[maxn]

;int tree[maxn <<2]

, lz[maxn <<2]

;inline int

max(

int a,

int b)

void

build

(int i,

int l,

int r)

int mid =

(l + r)

>>

1, k = i <<1;

build

(k, l, mid)

;build

(k |

1, mid +

1, r)

; tree[i]

=max

(tree[k]

, tree[k |1]

);}void

update

(int i,

int l,

int r,

int x,

int y)

int mid =

(l + r)

>>

1, k = i <<1;

if(x <= mid)

update

(k, l, mid, x, y)

;else

update

(k |

1, mid +

1, r, x, y)

; tree[i]

=max

(tree[k]

, tree[k |1]

);}void

pushdown

(int i)

}void

add(

int i,

int l,

int r,

int x,

int y,

int val)

pushdown

(i);

int mid =

(l + r)

>>

1, k = i <<1;

if(x > mid)

add(k |

1, mid +

1, r, x, y, val)

;else

if(y <= mid)

add(k, l, mid, x, y, val)

;else

add(k, l, mid, x, mid, val)

,add

(k |

1, mid +

1, r, mid +

1, y, val)

; tree[i]

=max

(tree[k]

, tree[k |1]

);}int

query

(int i,

int l,

int r,

int x,

int y)

線段樹,區間最值

codeforces 91b queue 線段樹,區間最值 題意是,對於給定區間內的每個元素,要求求出離他最遠的那個元素之間的距離。可以維護乙個線段樹的最小值,每次對於乙個元素,查詢其最右邊的元素的位置。include include include includeusing namespace s...

RMQ 區間最值 模板

rmq 的全稱為range max min query。構造dp陣列的時間為o nlogn 但是查詢時間為o 1 所以當資料量小於logn時,用樸素遍歷找最值就好,但是請求次數大於logn時,就要用這個模板。利用動態規劃的思想。int order maxn 使每乙個2 order i i 2 ord...

RMQ(區間最值問題)

1 概述 lca least common ancestors 即最近公共祖先,是指這樣乙個問題 在有根樹中,找出某兩個結點u和v最近的公共祖先 另一種說法,離樹根最遠的公共祖先 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,...