建樹
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,...