培訓- 7 間隔データ構造
間隔データ構造
c2251393
November 19, 2013
1 與線段樹
的 作的
的 用 的 變形
的 的
的
1.1 Dynamic Range Minimum Query
n 的 S S 的 作:
1. Si a 2. min(Sl..Sr)
1.2
的 用 O(1) O(n) 的
加 的
的
n b nb
的 O(b) 的 的
?
I
1.3 線段樹 間隔データ構造
[l, r] 的 [l, r] 的 的
分 的 的 nb
2b 變 O(nb +b)
b←√ n
1 7 2 2
5 16 1 3 7 12 26 17 32 55 2 6 7 99 12 2
標灰色的是詢問區間 [3,13] 的最小值所訪問的節點。
標灰色的是將第7個元素更新成3所影響到的節點。
黑色的是更新該區塊訪問到的節點。
1 3 2 2
5 16 1 3 7 12 3 17 32 55 2 6 7 99 12 2
實作 √
n std::vector
1.3 線段樹
加 變 ?
2k 的
( 2 ) 段的 (
3,4,,, ) 形 O(lgn) 的二 樹 的
的 2 的線段樹
的 的 O(lgn) 樹 的
的 的 O(lgn)
的 的 O(lgn)
II
1.4 二分搜 間隔データ構造
淺灰色的是詢問區間[2, 7]索取值的節點,深灰色的是走過的節點。
1
1 3
1 2 3 8
1 5 2 10 3 7 9 8
灰色的是將第3個位置修改成0所影響到及訪問到的節點。
1 → 0
1 → 0 3
1 2 → 0 3 8
1 5 2 → 0 10 3 7 9 8
1.4 二分搜
用線段樹 實作二 搜 樹 樹
[1, n] 段 的
的 的 ∞ insert 作 ∞ 的
delete lower bound 的 的
的
1.5 線段樹的實作
線段樹
III
1.5 線段樹的實作 間隔データ構造
1. 的 ( )
2. 的 l
3. r
4. 的 ( )
5. 的 ( )
6. 的 : blahblahblah
線段樹的 作 : 與
的 的 實 ( 1 的 )
的
用 lazy tag( ) 的
的 O(nlgn)
的 ! 線段樹 O(lgn)
O(lgn) ! i
covi, mini 分 的 covi mini 的
的: 的 的
covi mini 的 的 covi
lazy tag
的 二分搜
的實作的 用 實作 實作的 的
的 5 的 的
用 的 二 樹的 i 的 2i
2i+ 1
的 作 timei updatei
IV
2.變形與推廣 間隔データ構造
Algorithm 1Operations on segment tree
1: procedureoperation(id, tl, tr, ql, qr, T)
2: if qr < tl∨ql > tr then
3: return
4: end if
5: if [tl, tr]⊆[ql, qr]then
6: work(id, tl, tr, ql, qr, T)
7: end if
8: mid← tl+t2 r
9: operation(2id, tl, mid, ql, qr, T)
10: operation(2id+ 1, mid, tr, ql, qr, T)
11: work(id, tl, tr, ql, qr, T)
12: end procedure
2 變形與推廣
線段樹的 變形與推廣 的 與
的BIT 的 的樹套樹 Functional
Programming OI 的 :
2.1 BIT(Binary Indexed Tree)
線段樹的 作 :(1) (2)
的 用 BIT 線段樹
BIT 實 ( 的 用 ) 的線段樹
用 的
BIT 的 實作 用
的 用 作
的 : k 的 的
(k−2i, k] i k 的lowbit k 二 0
的 lowbit C++ :i = k&-k
(0, k] (k −lowbit(k), k] 與 (0, k−lowbit(k)] 的
k BIT 的
k0 = k, kj = kj−1 +lowbit(kj−1) k 的 V
2.2 樹套樹 間隔データ構造
二 的 1 的 O(lgk) 的
O(lgk∗C) C 的 :
Algorithm 2Operations on BIT
1: function update(id, x, T)
2: whileid≤n do
3: T[id]←T[id] +x
4: id←id+lowbit(id)
5: end while
6: end function
7: function query(id, T)
8: res←0
9: whileid >0do
10: res←res+T[id]
11: id←id+lowbit(id)
12: end while
13: return res
14: end function
2.2 樹套樹
樹 樹 樹 樹 線段樹 BIT
樹
的 線段樹套線段樹 (2 線段樹) BIT 套 BIT(2 BIT)
二 用 的 形的
的 2 線段樹 的 的 的
2.3
的 的 用
的 與 的 線
段樹 樹與
線段樹的 的
搜 的" "
線段樹 的樹
的樹 的 O(QN) ?
VI
3.應用 間隔データ構造
實 O(lgN)
的 的 的
變 O(N +QlgN)
: n 的 [l, r] k 的
n ≤105 用 線段樹的 的 :
1. 線段樹 的 用
merge sort 的 與 O(nlgn)
2. 二分搜 x [l, r] x
[l, r] 的 二分搜 x
O(lgk∗lgn∗lgn)
AC的作 用 線段樹 ?
1. i(1 ≤ i ≤ n) 用 的 線段樹 Ti 線段樹
的 [1, i] 的 Ti−1 變
O(nlgn)
2. 線段樹 的
k 線段樹 二分搜 的
[l, r] 的線段樹 二分搜 線段樹 ?
n [1, i] 的線段樹 Tl−1 Tr
線段樹 ( 的 )
O(lgn)
推廣 的
3 應用
用 的 的 ( 的
用的) 應用 ( 作 的 ) 的
的 的 的加
速
的 用 的
VII
3.1 加速選擇 間隔データ構造
3.1 加速選擇
DP Greedy 的 的 的
用 加速 的選擇
3.2
用 的 的
作 的 ( )
用 f :U7→N
用的 用 的 作 的
3.3 線
線 線 與 的 的
( )的 線 的
線 的 的 的
實用 的
3.4 樹
的 樹的 樹 樹
變 的
的 樹 的 用" 樹 分" 的
樹 分的 樹 分 (Heavy
樹的 ) (Light 的 ) 的 ( ) 用
( 線段樹) 的 樹 的
用線段樹 作 作 樹
的 O(lgn)
樹 分 的 OI 的 分
的 的 ( XD)
VIII
4. Exercise!!! 間隔データ構造
4 Exercise!!!
1. The Bus(POI XII)
n(≤105) wi 的 x, y
的
2. Pairs(IOI 2007, HOJ 256)
1,2,3 n(≤ 105) r 的
≤r
3. Sails(IOI 2007, HOJ 259)
n(≤ 105) 線 的 hi(≤ 105) 的
ki, 的 1 . 的 與 的
. 的 , 的
4. 形 (HOJ 12)
n(≤105) 與 的 形 形 的
5. Hiring(IOI 2009, HOJ 265)
n(≤5×105) 應 作 S Q
用的 的 ( )
W 的 的 的
6. (HOJ 154)
n(≤80000) (≤100000) [l, r] 的
7. (NPSC 2012 , HOJ 313)
n(≤ 100000) [l, r]
加 ≤S
8. Salesman(IOI 2009, HOJ 271)
的 H 加
t 的 r 加 的的 p (60% 的 t
r ) U 的
D H 加 H (
) ( ≤500000)
IX