Slide 1

Slide 1 text

1 / 277 Masaki Hara (qnighy) 2013年 情報オリンピック春期トレーニング合宿にて

Slide 2

Slide 2 text

2 / 277  有向木がたくさんあります  以下のクエリに高速で答えてください 1. Aの親をBにする ◦ Aは木の根で、BはAの子孫ではない 2. Aを親から切り離して木の根にする 3. A,Bが同じ木に属するか判定し、 同じ木に属する場合はLCAを求める

Slide 3

Slide 3 text

3 / 277  有向木がたくさんあります J F L G B D I C K E A H

Slide 4

Slide 4 text

4 / 277  有向木がたくさんあります  以下のクエリに高速で答えてください J F L G B D I C K E A H

Slide 5

Slide 5 text

5 / 277  1. Fの親をBにする J F L G B D I C K E A H

Slide 6

Slide 6 text

6 / 277  1. Fの親をBにする J F L G B D I C K E A H

Slide 7

Slide 7 text

7 / 277  1. Eの親をDにする J F L G B D I C K E A H

Slide 8

Slide 8 text

8 / 277  1. Eの親をDにする J F L G B D I C K E A H

Slide 9

Slide 9 text

9 / 277  2. Iを親から切り離して根にする J F L G B D I C K E A H

Slide 10

Slide 10 text

10 / 277  2. Iを親から切り離して根にする J F L G B D I C K E A H

Slide 11

Slide 11 text

11 / 277  2. Lを親から切り離して根にする J F L G B D I C K E A H

Slide 12

Slide 12 text

12 / 277  2. Lを親から切り離して根にする J F L G B D I C K E A H

Slide 13

Slide 13 text

13 / 277  3. GとHのLCAを求める J F L G B D I C K E A H

Slide 14

Slide 14 text

14 / 277  3. GとHのLCAを求める ◦ LCA: 最小共通先祖 J F L G B D I C K E A H

Slide 15

Slide 15 text

15 / 277  頂点数 ≤ 5000  クエリ数 ≤ 5000

Slide 16

Slide 16 text

16 / 277  各頂点は親リンクを覚えておく  クエリ1,2に対しては普通に答える F B

Slide 17

Slide 17 text

17 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては J F L G B D I C K E A H

Slide 18

Slide 18 text

18 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては ◦ Gから根に向かって辿る J F L G B D I C K E A H

Slide 19

Slide 19 text

19 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては ◦ Gから根に向かって辿る ◦ Hから根に向かって辿る J F L G B D I C K E A H

Slide 20

Slide 20 text

20 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては ◦ Gから根に向かって辿る ◦ Hから根に向かって辿る ◦ 並べる F G B D K E H

Slide 21

Slide 21 text

21 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては ◦ Gから根に向かって辿る ◦ Hから根に向かって辿る ◦ 並べる F G B D K E H D K

Slide 22

Slide 22 text

22 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては ◦ Gから根に向かって辿る ◦ Hから根に向かって辿る ◦ 根からの順番で並べる ◦ 一致する中で最も後ろのものを選ぶ F G B D K E H D K

Slide 23

Slide 23 text

23 / 277  各頂点は親リンクを覚えておく  クエリ3に対しては ◦ Gから根に向かって辿る ◦ Hから根に向かって辿る ◦ 根からの順番で並べる ◦ 根が一致しないときは-1

Slide 24

Slide 24 text

24 / 277  頂点数 ≤ 5000  クエリ数 ≤ 5000  計算量は()なので間に合う

Slide 25

Slide 25 text

25 / 277  頂点数 ≤ 106  クエリ数 ≤ 106  辺の削除は行われない

Slide 26

Slide 26 text

26 / 277  CがAとBのLCA A D C B F E

Slide 27

Slide 27 text

27 / 277  CがAとBのLCA ↓辺を追加 A D C B F E

Slide 28

Slide 28 text

28 / 277  CがAとBのLCA ↓辺を追加  Cは依然としてAとBのLCA A D C B F E

Slide 29

Slide 29 text

29 / 277  CがAとBのLCA ↓辺を追加  Cは依然としてAとBのLCA  最終的にできる木の上でLCAを計算できればよい

Slide 30

Slide 30 text

30 / 277  木の嬉しい順序(DFS順序) ◦ Preorder –頂点に入るときに記録する順序  A, B, D, E, C, F D B A E C F

Slide 31

Slide 31 text

31 / 277  木の嬉しい順序(DFS順序) ◦ Postorder – 頂点から出るときに記録する順序  D, E, B, F, C, A D B A E C F

Slide 32

Slide 32 text

32 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F

Slide 33

Slide 33 text

33 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A,

Slide 34

Slide 34 text

34 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B,

Slide 35

Slide 35 text

35 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D,

Slide 36

Slide 36 text

36 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B,

Slide 37

Slide 37 text

37 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E

Slide 38

Slide 38 text

38 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E, B,

Slide 39

Slide 39 text

39 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E, B, A,

Slide 40

Slide 40 text

40 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E, B, A, C,

Slide 41

Slide 41 text

41 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E, B, A, C, F,

Slide 42

Slide 42 text

42 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E, B, A, C, F, C,

Slide 43

Slide 43 text

43 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  頂点から入るときに記録し、  頂点から出るときにも 自分の親を記録する順序 D B A E C F A, B, D, B, E, B, A, C, F, C, A

Slide 44

Slide 44 text

44 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  木の辺を、行きと帰りの2つの辺から なるとみなすときの オイラー閉路に対応する D B A E C F A, B, D, B, E, B, A, C, F, C, A

Slide 45

Slide 45 text

45 / 277  木の嬉しい順序(DFS順序) ◦ Euler Tour  木の辺を、行きと帰りの2つの辺から なるとみなすときの オイラー閉路に対応する  オイラー閉路 (Euler Tour) : 全ての辺を1度ずつ通る閉路  オイラー路はケーニヒスベルクの橋問題で有名 Wikipediaより。 CC3.0-BY-SA

Slide 46

Slide 46 text

46 / 277  Euler TourによるLCAの計算 D B A E C F

Slide 47

Slide 47 text

47 / 277  Euler TourによるLCAの計算 D B A E C F A B D B E B A C F C A 1 2 3 2 3 2 1 2 3 2 1

Slide 48

Slide 48 text

48 / 277  Euler TourによるLCAの計算 D B A E C F A B D B E B A C F C A 1 2 3 2 3 2 1 2 3 2 1

Slide 49

Slide 49 text

49 / 277  Euler TourによるLCAの計算 D B A E C F A B D B E B A C F C A 1 2 3 2 3 2 1 2 3 2 1

Slide 50

Slide 50 text

50 / 277  Euler TourによるLCAの計算 D B A E C F A B D B E B A C F C A 1 2 3 2 3 2 1 2 3 2 1

Slide 51

Slide 51 text

51 / 277  Euler TourによるLCAの計算 D B A E C F A B D B E B A C F C A 1 2 3 2 3 2 1 2 3 2 1 深さ最小

Slide 52

Slide 52 text

52 / 277  Euler TourによるLCAの計算  RMQを利用 D B A E C F A B D B E B A C F C A 1 2 3 2 3 2 1 2 3 2 1 深さ最小

Slide 53

Slide 53 text

53 / 277  正当性

Slide 54

Slide 54 text

54 / 277  正当性: CがAとBのLCAのとき ◦ Euler Tour上でCは[A,B]に含まれる ◦ Euler Tour上で[A,B]に含まれるのはCの部分木  を言えばよい

Slide 55

Slide 55 text

55 / 277  正当性(1): Euler Tour上でCは[A,B]に含まれる ◦ AからBに行くにはCを経由しないといけない(LCAの性質より) ◦ ので当たり前

Slide 56

Slide 56 text

56 / 277  正当性(2): Euler Tour上で[A,B]に含まれるのは Cの部分木 ◦ Euler Tourにおいて部分木は連続した部分列として現れる ◦ ので当たり前

Slide 57

Slide 57 text

57 / 277  LCAを求めて終わり?

Slide 58

Slide 58 text

58 / 277  LCAを求めて終わり? ◦ あと少しだけやることがあります

Slide 59

Slide 59 text

59 / 277  「削除がない場合の利点」の考察を思い出す

Slide 60

Slide 60 text

60 / 277  「削除がない場合の利点」の考察を思い出す  LCAが存在するなら、最終的な木の上で計算すれば よい

Slide 61

Slide 61 text

61 / 277  「削除がない場合の利点」の考察を思い出す  LCAが存在するなら、最終的な木の上で計算すれば よい

Slide 62

Slide 62 text

62 / 277  A, Bが同じ木上にあるかどうかの判定が必要

Slide 63

Slide 63 text

63 / 277  A, Bが同じ木上にあるかどうかの判定が必要 ですが

Slide 64

Slide 64 text

64 / 277  A, Bが同じ木上にあるかどうかの判定が必要 ですが 辺の追加クエリしかないのでUnionFindでよい ということはすぐにわかると思います

Slide 65

Slide 65 text

65 / 277  頂点数 ≤ 106  クエリ数 ≤ 106  辺の削除は行われない  ( + log ) なので間に合う

Slide 66

Slide 66 text

66 / 277  ここまでの両方を実装すれば40点

Slide 67

Slide 67 text

67 / 277  ここまでの両方を実装すれば40点  複数のアルゴリズムを条件によって使い分けるテクは さすがに使っていると思います

Slide 68

Slide 68 text

68 / 277  頂点数 ≤ 106  クエリ数 ≤ 106

Slide 69

Slide 69 text

69 / 277  頂点数 ≤ 106  クエリ数 ≤ 106  削除クエリもある

Slide 70

Slide 70 text

70 / 277  追加も削除もある場合の頻出テク

Slide 71

Slide 71 text

71 / 277  追加も削除もある場合の頻出テク ◦ クエリの(平方)分割 ◦ がんばって動的になんとかする

Slide 72

Slide 72 text

72 / 277  追加も削除もある場合の頻出テク ◦ がんばって動的になんとかする

Slide 73

Slide 73 text

73 / 277  追加も削除もある場合の頻出テク ◦ がんばって動的になんとかする

Slide 74

Slide 74 text

74 / 277  木が静的な場合のLCA (復習)

Slide 75

Slide 75 text

75 / 277  木が静的な場合のLCA (復習) ◦ Euler Tour上で必要とされるクエリは以下の通り

Slide 76

Slide 76 text

76 / 277  木が静的な場合のLCA (復習) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる

Slide 77

Slide 77 text

77 / 277  木が静的な場合のLCA (復習) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる ◦ RMQで実現可能

Slide 78

Slide 78 text

78 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. ◦ RMQで実現可能な気がする

Slide 79

Slide 79 text

79 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. ◦ RMQで実現可能な気がする

Slide 80

Slide 80 text

80 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. 列の分割をする 4. ◦ RMQで実現可能な気がする

Slide 81

Slide 81 text

81 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. 列の分割をする 4. それだけ?

Slide 82

Slide 82 text

82 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. 列の分割をする 4. 区間に値を足す

Slide 83

Slide 83 text

83 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. 列の分割をする 4. 区間に値を足す ◦ この業界では「Starry Sky木」として知られているもの

Slide 84

Slide 84 text

84 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. 列の分割をする 4. 区間に値を足す ◦ この業界では「Starry Sky木」として知られているもの を平衡二分木として実装する必要がある (絶望)

Slide 85

Slide 85 text

85 / 277  木が動的な場合のLCA (絶望) ◦ Euler Tour上で必要とされるクエリは以下の通り 1. 区間の最小値をとる 2. 列の連結をする 3. 列の分割をする 4. 区間に値を足す ◦ この業界では「Starry Sky木」として知られているもの を平衡二分木として実装する必要がある (絶望)  しかもmerge/splitベースで

Slide 86

Slide 86 text

86 / 277  平衡二分木の中身は後回し

Slide 87

Slide 87 text

87 / 277  平衡二分木の中身は後回し  平衡二分木を使った具体的な実装方法

Slide 88

Slide 88 text

88 / 277  木の各頂点ごとに、Euler Tourのためのノードを2つ 用意する( , ) ◦ 上には頂点Aの番号と、その深さが記録されている ◦ 上には頂点Aの親Pの番号と、その深さが記録されている ◦ Aが根のときは のみ使う A B A B

Slide 89

Slide 89 text

89 / 277  木の連結 B D E A C F , , , , () , , , , () Depth 0 Depth 0 Depth 1 Depth 1 Depth 2 Depth 1

Slide 90

Slide 90 text

90 / 277  木の連結 1. Euler TourをA点で分割 ◦ A直下ならどの位置でもいい  の直後がおすすめ B D E A C F , , , , () ,                             , , , () Depth 0 Depth 0 Depth 1 Depth 1 Depth 2 Depth 1

Slide 91

Slide 91 text

91 / 277  木の連結 1. Euler TourをA点で分割 2. Euler Tourを挿入 B D E A C F , , , , , , (), , , , () Depth 0 Depth 0 Depth 1 Depth 1 Depth 2 Depth 1

Slide 92

Slide 92 text

92 / 277  木の連結 1. Euler TourをA点で分割 2. Euler Tourを挿入 3. 深さを調整 B D E A C F , , , , , , (), , , , () Depth 0 Depth 1 Depth 2 Depth 2 Depth 2 Depth 1

Slide 93

Slide 93 text

93 / 277  木の削除: 追加のときと逆操作

Slide 94

Slide 94 text

94 / 277  平衡Starry Sky Treeがあればよいことがわかった

Slide 95

Slide 95 text

95 / 277  平衡Starry Sky Treeがあればよいことがわかった  ではどのように実装するか?(実装例)

Slide 96

Slide 96 text

96 / 277  今回は、葉ノードと内部ノードの区別をしない ◦ A,B,C,D,Eはどれも列上の項目とする B A D E C

Slide 97

Slide 97 text

97 / 277  各ノードは、Δ というフィールドを持つ B A D E C

Slide 98

Slide 98 text

98 / 277  各ノードは、Δ というフィールドを持つ  各ノードに定めたい値 は、 = Δ から根までのパス上のノード B A D E C

Slide 99

Slide 99 text

99 / 277  = Δ + Δ + Δ  = Δ + Δ  = Δ + Δ + Δ  = Δ  = Δ + Δ B A D E C

Slide 100

Slide 100 text

100 / 277  木の回転: が保存されるように行う  Δ ′ = −  Δ ′ =  Δ ′ = −  Δ ′ = −  Δ ′ = − D C B A E

Slide 101

Slide 101 text

101 / 277  木の回転: が保存されるように行う  Δ ′ = Δ  Δ ′ = Δ + Δ  Δ ′ = Δ + Δ  Δ ′ = −Δ  Δ ′ = Δ D C B A E

Slide 102

Slide 102 text

102 / 277  最後に、ノードに値 を  = min の全ての子孫 −  となるように計算して保持しておく

Slide 103

Slide 103 text

103 / 277  最後に、ノードに値 を  = min の全ての子孫 −  となるように計算して保持しておく  これでStarry Sky Tree相当の計算を行えるようになる

Slide 104

Slide 104 text

104 / 277  平衡二分木の基本

Slide 105

Slide 105 text

105 / 277  平衡二分木の基本:回転操作

Slide 106

Slide 106 text

106 / 277  回転操作: 順序を保存したまま木構造を変形

Slide 107

Slide 107 text

107 / 277  回転操作: 順序を保存したまま木構造を変形  次のような二分木を考える B C D E A

Slide 108

Slide 108 text

108 / 277  回転操作: 順序を保存したまま木構造を変形  次のような二分木を考える  順序: 左の子孫→自分→右の子孫 B C D E A

Slide 109

Slide 109 text

109 / 277  回転操作: 順序を保存したまま木構造を変形  次のような二分木を考える  順序: 左の子孫→自分→右の子孫  この場合は A, B, C, D, E の順番 B C D E A

Slide 110

Slide 110 text

110 / 277  次のように変形しても順番はA,B,C,D,E B C D E A D E B A C

Slide 111

Slide 111 text

111 / 277  次のように変形しても順番はA,B,C,D,E  これを「木の回転」と言う B C D E A D E B A C

Slide 112

Slide 112 text

112 / 277  次のように変形しても順番はA,B,C,D,E  これを「木の回転」と言う  うまく回転をすることで、偏りが起きないようにする二 分木を「平衡二分木」と言う ◦ 回転以外の方法で平衡を保つものもある

Slide 113

Slide 113 text

113 / 277  平衡二分木の実装方法

Slide 114

Slide 114 text

114 / 277  平衡二分木の実装方法  今回は何でもOK! ◦ 赤黒木 ◦ RBST ◦ Treap ◦ Splay木 ◦ などなど…

Slide 115

Slide 115 text

115 / 277  この解説ではSplay木の説明をします

Slide 116

Slide 116 text

116 / 277  突然ですが、Union Findの復習をします

Slide 117

Slide 117 text

117 / 277  突然ですが、Union Findの復習をします  Union Find の効率化テクニック:  アクセスした頂点を根へ持っていく B D A F E C

Slide 118

Slide 118 text

118 / 277  突然ですが、Union Findの復習をします  Union Find の効率化テクニック:  アクセスした頂点を根へ持っていく B D A F E C

Slide 119

Slide 119 text

119 / 277  突然ですが、Union Findの復習をします  Union Find の効率化テクニック:  アクセスした頂点を根へ持っていく B D A F E C

Slide 120

Slide 120 text

120 / 277  突然ですが、Union Findの復習をします  Union Find の効率化テクニック:  アクセスした頂点を根へ持っていく B D A F E C

Slide 121

Slide 121 text

121 / 277  突然ですが、Union Findの復習をします  Union Find の効率化テクニック:  アクセスした頂点を根へ持っていく B D A F E C

Slide 122

Slide 122 text

122 / 277  突然ですが、Union Findの復習をします  Union Find の効率化テクニック:  アクセスした頂点を根へ持っていく B D A F E C

Slide 123

Slide 123 text

123 / 277  同じようなことを、二分探索木でもできないか?

Slide 124

Slide 124 text

124 / 277  同じようなことを、二分探索木でもできないか? ◦ →Move-to-root heuristic

Slide 125

Slide 125 text

125 / 277  Move-to-root heuristic ◦ 頂点にアクセスしたら、それが根に行くまで繰り返し回転する

Slide 126

Slide 126 text

126 / 277  Move-to-root heuristic ◦ 頂点にアクセスしたら、それが根に行くまで繰り返し回転する ◦ そんなので上手くいくわけないだろ!!

Slide 127

Slide 127 text

127 / 277  実際ダメ

Slide 128

Slide 128 text

128 / 277  実際ダメ A B C D E

Slide 129

Slide 129 text

129 / 277  実際ダメ A B C D E

Slide 130

Slide 130 text

130 / 277  実際ダメ B A C D E

Slide 131

Slide 131 text

131 / 277  実際ダメ B C A D E

Slide 132

Slide 132 text

132 / 277  実際ダメ B C D A E

Slide 133

Slide 133 text

133 / 277  実際ダメ B C D E A

Slide 134

Slide 134 text

134 / 277  実際ダメ  この後A, B, C, D, Eの順にアクセスしたら + − 1 + … + 1 = 2  のコストがかかってしまう

Slide 135

Slide 135 text

135 / 277  実際ダメ  この後A, B, C, D, Eの順にアクセスしたら + − 1 + … + 1 = 2  のコストがかかってしまう  どうする?

Slide 136

Slide 136 text

136 / 277  解決策: 木の回転を3つに分ける

Slide 137

Slide 137 text

137 / 277  解決策: 木の回転を3つに分ける ◦ “zig” step ◦ “zig-zag” step ◦ “zig-zig” step

Slide 138

Slide 138 text

138 / 277  (1) “zig”-step

Slide 139

Slide 139 text

139 / 277  (1) “zig”-step  すぐ上が根の場合 R A

Slide 140

Slide 140 text

140 / 277  (1) “zig”-step  すぐ上が根の場合  普通に回転する R A

Slide 141

Slide 141 text

141 / 277  (2) “zig-zag”-step

Slide 142

Slide 142 text

142 / 277  (2) “zig-zag”-step  左→右、またはその逆のとき P A G

Slide 143

Slide 143 text

143 / 277  (2) “zig-zag”-step  左→右、またはその逆のとき  普通に2回回転する P A G

Slide 144

Slide 144 text

144 / 277  (2) “zig-zag”-step  左→右、またはその逆のとき  普通に2回回転する P A G

Slide 145

Slide 145 text

145 / 277  (2) “zig-zag”-step  左→右、またはその逆のとき  普通に2回回転する  ここまでは先ほどと同じ

Slide 146

Slide 146 text

146 / 277  (3) “zig-zig”-step

Slide 147

Slide 147 text

147 / 277  (3) “zig-zig”-step  左→左、またはその逆のとき P A G

Slide 148

Slide 148 text

148 / 277  (3) “zig-zig”-step  左→左、またはその逆のとき  2回ではなく3回回転する P A G

Slide 149

Slide 149 text

149 / 277  (3) “zig-zig”-step  左→左、またはその逆のとき  2回ではなく3回回転する P A G

Slide 150

Slide 150 text

150 / 277  (3) “zig-zig”-step  左→左、またはその逆のとき  2回ではなく3回回転する P A G

Slide 151

Slide 151 text

151 / 277  (3) “zig-zig”-step  左→左、またはその逆のとき  2回ではなく3回回転する  (ただし、後でこれを2回として扱う) P A G

Slide 152

Slide 152 text

152 / 277  Splaying operation ◦ 偏った位置にあるときだけ余計に回転する

Slide 153

Slide 153 text

153 / 277  Splaying operation ◦ 偏った位置にあるときだけ余計に回転する ◦ そんなので上手くいくわけないだろ!!

Slide 154

Slide 154 text

154 / 277  実は上手くいく

Slide 155

Slide 155 text

155 / 277  実は上手くいく  具体的には: (log ) amortized

Slide 156

Slide 156 text

156 / 277  実は上手くいく  具体的には: (log ) amortized

Slide 157

Slide 157 text

157 / 277  ならし計算量 (amortized time complexity)  N個の一連の操作が(())で行えるとする  1つ1つの操作は、本当は( )とは限らない  これを( )として扱うのが、ならし計算量

Slide 158

Slide 158 text

158 / 277  ならし計算量のイメージ ならし計算量 本当の計算量 操作1 操作2 操作3 操作4 操作5

Slide 159

Slide 159 text

159 / 277  ならし計算量の向き/不向き

Slide 160

Slide 160 text

160 / 277  ならし計算量の向き/不向き  向いているもの ◦ 全体での処理効率が重視されるバッチ型の処理 ◦ 例: プログラミングコンテスト  向いていないもの ◦ リアルタイム性能が重視される処理 ◦ 例: 信号処理

Slide 161

Slide 161 text

161 / 277  ならし計算量と平均計算量

Slide 162

Slide 162 text

162 / 277  ならし計算量と平均計算量 ◦ この2つは別物!! ◦ ならし計算量 : 時系列上での平均 ◦ 平均計算量 : 確率変数上での平均

Slide 163

Slide 163 text

163 / 277  ならし計算量と平均計算量 ◦ この2つは別物!! ◦ ならし計算量 : 時系列上での平均 ◦ 平均計算量 : 確率変数上での平均 ◦ ならし計算量 : 不確定要素は無い!

Slide 164

Slide 164 text

164 / 277  Splayのならし計算量の評価

Slide 165

Slide 165 text

165 / 277  Splayのならし計算量の評価  「ポテンシャル関数」の概念を導入

Slide 166

Slide 166 text

166 / 277  Splayのならし計算量の評価  「ポテンシャル関数」の概念を導入 ◦ 借金みたいなもの

Slide 167

Slide 167 text

167 / 277  ポテンシャル関数を用いた計算量の均し(ならし)  = + Φ+1 − Φj ◦ : その操作の実際の計算量 ◦ Φ+1 − Φj : ポテンシャルの増加量 ◦ : その操作のならし計算量

Slide 168

Slide 168 text

168 / 277  ポテンシャル関数を用いた計算量の均し(ならし)  = + Φ+1 − Φj ◦ : その操作の実際の計算量 ◦ Φ+1 − Φj : ポテンシャルの増加量 ◦ : その操作のならし計算量  ポテンシャルの意味 ◦ より大きい: 木はより偏っている ◦ より小さい: 木はより平坦になっている

Slide 169

Slide 169 text

169 / 277  ならし計算量の総和をとる  = + Φ − Φ0 ◦ : 実際の計算量の総和 ◦ Φ − Φ0 : ポテンシャルの総変化量 ◦ : ならし計算量の総和

Slide 170

Slide 170 text

170 / 277  ならし計算量の総和をとる  = + Φ − Φ0 ◦ : 実際の計算量の総和 ◦ Φ − Φ0 : ポテンシャルの総変化量 ◦ : ならし計算量の総和  ポテンシャルの総変化量が小さければうまく評価でき る

Slide 171

Slide 171 text

171 / 277  Splay木のポテンシャル ◦ Splay木の各頂点の重さを()とする  計算量の見積もり方にあわせて自由に決めてよい ◦ Splay木の頂点のサイズ s = () の全ての子孫 ◦ Splay木の頂点のランク = log2 () ◦ Splay木のポテンシャル Φ = () 全ての頂点

Slide 172

Slide 172 text

172 / 277  Splay木のポテンシャル: 例

Slide 173

Slide 173 text

173 / 277  Splay木のポテンシャル: 例  重さ () (今回は全て1とする) 1 1 1 1 1 1 1

Slide 174

Slide 174 text

174 / 277  Splay木のポテンシャル: 例  サイズ () ◦ 部分木の重さの和 5 3 7 1 1 1 1

Slide 175

Slide 175 text

175 / 277  Splay木のポテンシャル: 例  ランク = log2 () 2.3 1.6 2.8 0.0 0.0 0.0 0.0

Slide 176

Slide 176 text

176 / 277  Splay木のポテンシャル: 例  ポテンシャル: ランクの総和  Φ = 2.8 + 2.3 + 1.6 = 6.7

Slide 177

Slide 177 text

177 / 277  Splay木のポテンシャルの良い性質

Slide 178

Slide 178 text

178 / 277  Splay木のポテンシャルの良い性質 …  回転の影響を受ける頂点が少ない ◦ 解析が簡単になる

Slide 179

Slide 179 text

179 / 277  アクセス補題 (Access Lemma)

Slide 180

Slide 180 text

180 / 277  アクセス補題 (Access Lemma)  : 木のノード  : 木の根 とするとき  木をsplayする操作一回にかかる時間(回転の回数) は、ならし計算量で 3 − 3 + 1  以下である。

Slide 181

Slide 181 text

181 / 277  アクセス補題の証明

Slide 182

Slide 182 text

182 / 277  アクセス補題の証明  各回転ステップのならし計算量が 1. “zig”-stepでは 3′ − 3 + 1 以下 2. それ以外では 3′ − 3() 以下  (ただし、′() : 操作後のランク)  であることを示す。  そうすると、1のケースに登場する′()は初期の() と等しい(木全体のサイズの対数)ので、合計すると 3 − 3 + 1になる。

Slide 183

Slide 183 text

183 / 277  アクセス補題の証明 (1) “zig”-step の場合  = log2 ( + + )  = log2 ( + + + + ()) X B R C A

Slide 184

Slide 184 text

184 / 277  アクセス補題の証明 (1) “zig”-step の場合  = log2 ( + + )  ′ = log2 ( + + + + )  = log2 ( + + + + ())  ′ = log2 ( + + ) X B R C A

Slide 185

Slide 185 text

185 / 277  アクセス補題の証明 (1) “zig”-step の場合  = log2 ( + + )  ′ = log2 ( + + + + )  = log2 ( + + + + ())  ′ = log2 ( + + )

Slide 186

Slide 186 text

186 / 277  アクセス補題の証明 (1) “zig”-step の場合  = log2 ( + + )  ′ = log2 ( + + + + )  = log2 ( + + + + ())  ′ = log2 ( + + )  ≤ ′ , ′ ≤ ()

Slide 187

Slide 187 text

187 / 277  アクセス補題の証明 (1) “zig”-step の場合  ≤ ′ , ′ ≤ ()  ならし計算量 = + Φ′ − Φ = 1 + ′ + ′ − − ≤ 1 + ′ − ≤ 1 + 3′ − 3

Slide 188

Slide 188 text

188 / 277  アクセス補題の証明 (2) “zigzig”-step の場合  = log2 ( + + )  = log2 ( + + + + ())  = log2 ( + + + + + + ) X B P C A G D

Slide 189

Slide 189 text

189 / 277  アクセス補題の証明 (2) “zigzig”-step の場合  = log2 ( + + )  ′ = log2 ( + + + + + + )  = log2 ( + + + + ())  ′ = log2 ( + + + )  = log2 ( + + + + + + )  ′ = log2 ( + + ) X B P C A G D

Slide 190

Slide 190 text

190 / 277  アクセス補題の証明 (2) “zigzig”-step の場合  = log2 ( + + )  ′ = log2 ( + + + + + + )  = log2 ( + + + + ())  ′ = log2 ( + + + )  = log2 ( + + + + + + )  ′ = log2 ( + + )

Slide 191

Slide 191 text

191 / 277  アクセス補題の証明 (2) “zigzig”-step の場合  ′ = , ′ ≤ ′ , ≤

Slide 192

Slide 192 text

192 / 277  アクセス補題の証明 (2) “zigzig”-step の場合  ′ = , ′ ≤ ′ , ≤ = + Φ′ − Φ = 2 + ′ + ′ + ′ − − − ≤ 2 + ′ + ′ − 2

Slide 193

Slide 193 text

193 / 277  アクセス補題の証明 (2) “zigzig”-step の場合  2 + ′ + ′ − 2 ≤ 3′ − 3  理由: ′ + − 2′ ≤ −2 を示したい。  ところで左辺はlog2 ′ ′ + log2 ′ であり、  log2 が上に凸で、′ + ≤ ′()なのでこの 値は高々−2  よって不等式は示された。

Slide 194

Slide 194 text

194 / 277  アクセス補題の証明 (3) “zigzag”-step の場合  ′ = , ≤  ′ + ′ ≤ ′ X C P A B G D X G B A P C D

Slide 195

Slide 195 text

195 / 277  アクセス補題の証明 (3) “zigzag”-step の場合  以下(2)と同様

Slide 196

Slide 196 text

196 / 277  以上より、Splay操作がならし計算量で(log )であ ることがわかった。  ところで、Splay操作のポテンシャルは高々 ( log )なので、全体で(( + ) log )でクエリ を処理できることがわかった。

Slide 197

Slide 197 text

197 / 277  以上より、Splay操作がならし計算量で(log )であ ることがわかった。  ところで、Splay操作のポテンシャルは高々 ( log )なので、全体で(( + ) log )でクエリ を処理できることがわかった。  以上、満点解法その1

Slide 198

Slide 198 text

198 / 277  満点解法その2 - Link/Cut木

Slide 199

Slide 199 text

199 / 277  満点解法その2 - Link/Cut木  Link/Cut木 ◦ 元々、フローアルゴリズムの高速化のためにSleatorとTarjan が考案したもの

Slide 200

Slide 200 text

200 / 277  満点解法その2 - Link/Cut木  Link/Cut木 ◦ 元々、フローアルゴリズムの高速化のためにSleatorとTarjan が考案したもの ◦ この問題のために必要な実装は、それよりもはるかに容易

Slide 201

Slide 201 text

201 / 277  満点解法その2 - Link/Cut木  Link/Cut木 ◦ 元々、フローアルゴリズムの高速化のためにSleatorとTarjan が考案したもの ◦ この問題のために必要な実装は、それよりもはるかに容易 →Link/Cut木の練習としても適している

Slide 202

Slide 202 text

202 / 277  満点解法その2 - Link/Cut木  Link/Cut木 ◦ 元々、フローアルゴリズムの高速化のためにSleatorとTarjan が考案したもの ◦ この問題のために必要な実装は、それよりもはるかに容易 →Link/Cut木の練習としても適している ◦ いろいろなバージョンがあるが、Splay木によるものが使いや すい

Slide 203

Slide 203 text

203 / 277  予備知識 – Heavy/Light decomposition

Slide 204

Slide 204 text

204 / 277  予備知識 – Heavy/Light decomposition ◦ 木をパスに分割する方法 B D E A C F

Slide 205

Slide 205 text

205 / 277  予備知識 – Heavy/Light decomposition ◦ 木をパスに分割する方法 B D E A C F

Slide 206

Slide 206 text

206 / 277  予備知識 – Heavy/Light decomposition ◦ 木をパスに分割する方法  変な形の木でも、「パスの木」の形に潰すと安定する

Slide 207

Slide 207 text

207 / 277  Splay Treeの世界 列データ Splay Tree 列の畳み込みを効率よく計算

Slide 208

Slide 208 text

208 / 277  Splay Treeの世界 列データ Splay Tree 列の畳み込みを効率よく計算

Slide 209

Slide 209 text

209 / 277  Heavy/Light decompositionの世界 列データ 有向木を分解したもの 有向木 Splay Tree 列の畳み込みを効率よく計算

Slide 210

Slide 210 text

210 / 277  Link/Cut Treeの世界 列データ 有向木を分解したもの Splay Tree 列の畳み込みを効率よく計算 有向木 Link/Cut Tree パスの畳み込みを効率よく計算

Slide 211

Slide 211 text

211 / 277  Link/Cut Treeの世界  H/L分解 = パスからなる木

Slide 212

Slide 212 text

212 / 277  Link/Cut Treeの世界  H/L分解 = パスからなる木  Link/Cut Tree = Splay木からなる木

Slide 213

Slide 213 text

213 / 277  Link/Cut Tree の辺は二種類ある ◦ Solid(Heavy) edge ◦ Dashed(Light) edge

Slide 214

Slide 214 text

214 / 277  Link/Cut Tree の辺は二種類ある Solid(Heavy) Dashed(Light) 所属 Splay Tree H/L分解の木 分類 二分木 多分木 左右の区別 左右の区別あり なし 親 本当は祖先か子孫 本当の親 子供 本当は祖先か子孫 本当は子孫

Slide 215

Slide 215 text

215 / 277  Solid, Dashedの区別

Slide 216

Slide 216 text

216 / 277  Solid, Dashedの区別  いずれも、親方向リンクを持つ X R L M

Slide 217

Slide 217 text

217 / 277  Solid, Dashedの区別  いずれも、親方向リンクを持つ  親から左方向リンクがあれば、Solid X R L M

Slide 218

Slide 218 text

218 / 277  Solid, Dashedの区別  いずれも、親方向リンクを持つ  親から左方向リンクがあれば、Solid  親から右方向リンクがあれば、Solid X R L M

Slide 219

Slide 219 text

219 / 277  Solid, Dashedの区別  いずれも、親方向リンクを持つ  親から左方向リンクがあれば、Solid  親から右方向リンクがあれば、Solid  どちらもなければ、Dashed X R L M

Slide 220

Slide 220 text

220 / 277  Solid, Dashedの区別  いずれも、親方向リンクを持つ  親から左方向リンクがあれば、Solid  親から右方向リンクがあれば、Solid  どちらもなければ、Dashed  「右, 左, 親」の3つのリンクだけで構造を保持できる!

Slide 221

Slide 221 text

221 / 277  小さな例 C E D B F A

Slide 222

Slide 222 text

222 / 277  小さな例 C E D B F A

Slide 223

Slide 223 text

223 / 277  小さな例 C E D B F A C E D B F A

Slide 224

Slide 224 text

224 / 277  小さな例 C E D B F A C E D B F A C E D B F A

Slide 225

Slide 225 text

225 / 277  Link/Cut Treeの操作: splayLC()  Link/Cut Tree上では、任意の頂点Xを根に持っていく ことができる ◦ 元の木の構造は変化しないことに注意

Slide 226

Slide 226 text

226 / 277  前準備: splay  各Splay Tree上でsplayをすることで、Xから今の根ま でを点線だけで行けるようにする

Slide 227

Slide 227 text

227 / 277  前準備: splay  各Splay Tree上でsplayをすることで、Xから今の根ま でを点線だけで行けるようにする C E D B F A

Slide 228

Slide 228 text

228 / 277  前準備: splay  各Splay Tree上でsplayをすることで、Xから今の根ま でを点線だけで行けるようにする C E D B F A

Slide 229

Slide 229 text

229 / 277  前準備: splay  各Splay Tree上でsplayをすることで、Xから今の根ま でを点線だけで行けるようにする C E D B F A EからBまで、点 線のみで行ける ようになる

Slide 230

Slide 230 text

230 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  元の木ではこんな感じ

Slide 231

Slide 231 text

231 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  元の木ではこんな感じ C E D B F A

Slide 232

Slide 232 text

232 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  元の木ではこんな感じ C E D B F A

Slide 233

Slide 233 text

233 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  元の木ではこんな感じ C E D B F A

Slide 234

Slide 234 text

234 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  Link/Cut 木でも、左向きのSolid辺を付け替えるだけ

Slide 235

Slide 235 text

235 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  Link/Cut 木でも、左向きのSolid辺を付け替えるだけ C E D B F A

Slide 236

Slide 236 text

236 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  Link/Cut 木でも、左向きのSolid辺を付け替えるだけ C E D B F A

Slide 237

Slide 237 text

237 / 277  splayLC() のメイン操作: つなぎ変え(expose操作)  パスのつなぎ変え操作を行う  Link/Cut 木でも、左向きのSolid辺を付け替えるだけ C E D B F A

Slide 238

Slide 238 text

238 / 277  左向きの辺をつなぎ替えるだけで、Eが一番上の木に 所属するようになった

Slide 239

Slide 239 text

239 / 277  左向きの辺をつなぎ替えるだけで、Eが一番上の木に 所属するようになった  最後にもう1度splay()操作を行うことで、Link/Cut Treeの一番上の根にEが来る

Slide 240

Slide 240 text

240 / 277  L/C木のsplayLC()はSplay Treeの解析を少し応用す ると、対数時間であることが言える

Slide 241

Slide 241 text

241 / 277  L/C木のsplayLC()はSplay Treeの解析を少し応用す ると、対数時間であることが言える  1回ごとのsplay()操作が対数時間であることは既に わかっている

Slide 242

Slide 242 text

242 / 277  L/C木のsplayLC()はSplay Treeの解析を少し応用す ると、対数時間であることが言える  1回ごとのsplay()操作が対数時間であることは既に わかっている  しかし実際にはsplay()操作が回呼ばれている ◦ は、パス分割された木の上での深さ

Slide 243

Slide 243 text

243 / 277  ポテンシャルの定義 ◦ サイズ = solid/dashedに関わらず、子孫になっている頂点の 数 ◦ ランク = その対数 ◦ ポテンシャル = ランクの総和の2倍 として定める

Slide 244

Slide 244 text

244 / 277  Splay Treeのならし計算量は 1 + 3 − 3() だっ た  今回のならし計算量は + 6 − 6()になる ◦ 「Splayが回呼ばれる」という認識を改めてみる ◦ Splayは根に向かって順番に呼ばれるということを考慮すると、 「Splayが1回呼ばれるが、途中でk回、強制的にzigステップを 使われるかもしれない」と考えることができる ◦ 係数が2倍なのはポテンシャルの定義を変えたから

Slide 245

Slide 245 text

245 / 277  余った定数項の回収  Expose操作のあとに1回行うsplay操作: k回の回転を 行う。  ポテンシャルの定義を2倍にしたので、splayの回転操 作1回につき1の追加コストを課しても問題ない

Slide 246

Slide 246 text

246 / 277  ならしコスト6 log2 のsplay操作を2回呼んでいるの で、splayLC()のならし計算量は12 log2 = (log ) であるとわかった。

Slide 247

Slide 247 text

247 / 277  AとBのLCAを求める。

Slide 248

Slide 248 text

248 / 277  AとBのLCAを求めるには、まず 1. Bに対してsplayLC()を行う 2. Aに対してsplayLC()を行う  このとき、Bは浅い位置にいる。 ◦ Splay Treeに対するSplay操作1回で、他の頂点の深さは高々 2段しか下がらないので、この時点でBは深さ高々4程度。

Slide 249

Slide 249 text

249 / 277  AとBの位置関係に基いて条件分岐

Slide 250

Slide 250 text

250 / 277  AとBの位置関係に基いて条件分岐  (1) BがAの左側にある場合 ◦ この場合は、BはAの子孫ということになるので、AとBのLCA はAになる。  (2) BがAの右側にある場合 ◦ 次のページへ

Slide 251

Slide 251 text

251 / 277  BがAの右側にある場合の条件分岐  (1) BがAと同じSplay Treeに属する場合 ◦ この場合は、AはBの子孫ということになるので、AとBのLCA はBになる。

Slide 252

Slide 252 text

252 / 277  BがAの右側にある場合の条件分岐  (1) BがAと同じSplay Treeに属する場合 ◦ この場合は、AはBの子孫ということになるので、AとBのLCA はBになる。  (2) BがAと異なるSplay Treeに属する場合 ◦ 一番一般的な場合。 ◦ Bから上に辿り、Aと同じSplay Treeに到達したところの頂点が、 AとBのLCAになる。

Slide 253

Slide 253 text

253 / 277  BがAの右側にある場合の条件分岐  (1) BがAと同じSplay Treeに属する場合 ◦ この場合は、AはBの子孫ということになるので、AとBのLCA はBになる。  (2) BがAと異なるSplay Treeに属する場合 ◦ 一番一般的な場合。 ◦ Bから上に辿り、Aと同じSplay Treeに到達したところの頂点が、 AとBのLCAになる。  これでLCAは求められた。

Slide 254

Slide 254 text

254 / 277  クエリ1,2番に対応する「接続」「切断」は、 Link/Cut Treeの”link”, “cut” に対応する。

Slide 255

Slide 255 text

255 / 277  クエリ1,2番に対応する「接続」「切断」は、 Link/Cut Treeの”link”, “cut” に対応する。  (1) Link操作 – AをBの子にする ◦ AとBをsplayLC()しておいてから、Aの親として(dashedで)Bを 設定するだけ。 ◦ 計算量: AとBがLink/Cut Treeにおける根にあるので、Bのサ イズが高々増える程度。これによってポテンシャルは (log ) しか増えない。

Slide 256

Slide 256 text

256 / 277  クエリ1,2番に対応する「接続」「切断」は、 Link/Cut Treeの”link”, “cut” に対応する。  (2) Cut操作 – Aを親から切り離す ◦ AをsplayLC()してからAの右の子を切り離す。 ◦ 計算量:ポテンシャルは明らかに減っている。

Slide 257

Slide 257 text

257 / 277  以上がLink/Cut Treeによる満点解法。

Slide 258

Slide 258 text

258 / 277  Euler Tour Tree と Link/Cut Tree は動的木の筆頭

Slide 259

Slide 259 text

259 / 277  Euler Tour Tree と Link/Cut Tree は動的木の筆頭  今回はどちらを選ぶべきだったか?

Slide 260

Slide 260 text

260 / 277  Euler Tour Tree と Link/Cut Tree は動的木の筆頭  今回はどちらを選ぶべきだったか?  (他の問題は解き終わっているとして)

Slide 261

Slide 261 text

261 / 277  Euler Tour Tree ◦ 知識: ◦ 実装:  Link/Cut Tree ◦ 知識: ◦ 実装:

Slide 262

Slide 262 text

262 / 277  Euler Tour Tree ◦ 知識: 過去にも出題済みの知識の組合せ。 ◦ 実装:  Link/Cut Tree ◦ 知識: ◦ 実装:

Slide 263

Slide 263 text

263 / 277  Euler Tour Tree ◦ 知識: 過去にも出題済みの知識の組合せ。 ◦ 実装: 組み合わせてはいけないものを組み合わせてしまった 感じ  Link/Cut Tree ◦ 知識: ◦ 実装:

Slide 264

Slide 264 text

264 / 277  Euler Tour Tree ◦ 知識: 過去にも出題済みの知識の組合せ。 ◦ 実装: 組み合わせてはいけないものを組み合わせてしまった 感じ  Link/Cut Tree ◦ 知識: 必須 ◦ 実装:

Slide 265

Slide 265 text

265 / 277  Euler Tour Tree ◦ 知識: 過去にも出題済みの知識の組合せ。 ◦ 実装: 組み合わせてはいけないものを組み合わせてしまった 感じ  Link/Cut Tree ◦ 知識: 必須 ◦ 実装: 頂点にデータを持たせなくてよいなど、この問題におい ては極めて有利

Slide 266

Slide 266 text

266 / 277  Euler Tour Tree ◦ 知識: 過去にも出題済みの知識の組合せ。 ◦ 実装: 組み合わせてはいけないものを組み合わせてしまった 感じ  Link/Cut Tree ◦ 知識: 必須 ◦ 実装: 頂点にデータを持たせなくてよいなど、この問題におい ては極めて有利  知っているならLink/Cut を書くべきだったかもしれな い

Slide 267

Slide 267 text

267 / 277  Link/Cutを学ぶべきか?

Slide 268

Slide 268 text

268 / 277  Link/Cutを学ぶべきか? ◦ Link/Cutでなければ出来ない、という問題は、恐らくない

Slide 269

Slide 269 text

269 / 277  Link/Cutを学ぶべきか? ◦ Link/Cutでなければ出来ない、という問題は、恐らくない ◦ しかし、Link/Cutを使うと有利な問題は実際に存在している

Slide 270

Slide 270 text

270 / 277  qnighyからの提案

Slide 271

Slide 271 text

271 / 277  qnighyからの提案 ◦ 合宿参加者の大半にとっては、Link/Cut Treeを習得するコ ストが高くつく上に、他の学習をしたほうがずっと為になると 思う。

Slide 272

Slide 272 text

272 / 277  qnighyからの提案 ◦ 合宿参加者の大半にとっては、Link/Cut Treeを習得するコ ストが高くつく上に、他の学習をしたほうがずっと為になると 思う。 ◦ より上位の人や、単純に興味があるという人に関しては、こ の限りではない。

Slide 273

Slide 273 text

273 / 277  qnighyからの提案 ◦ 合宿参加者の大半にとっては、Link/Cut Treeを習得するコ ストが高くつく上に、他の学習をしたほうがずっと為になると 思う。 ◦ より上位の人や、単純に興味があるという人に関しては、こ の限りではない。 ◦ いずれにせよ、学習するつもりなら、身に付けるために問題 を解くべきだろう。

Slide 274

Slide 274 text

274 / 277  JOI2010春合宿 Day4 “Highway”  JOI2012本選 問題5 “Festivals in JOI Kingdom”  IOI2011 Day2 “Elephants”  IJPC2012 Day3 “Animals2”

Slide 275

Slide 275 text

275 / 277  完全制覇・ツリー上でのクエリ処理技法 [iwiwi] http://topcoder.g.hatena.ne.jp/iwiwi/20111205/13 23099376  プログラミングコンテストでのデータ構造 2 ~動的木 編~ [iwiwi] http://www.slideshare.net/iwiwi/2-12188845  蟻本 [iwiwi]

Slide 276

Slide 276 text

276 / 277  Daniel D. Sleator and Robert E. Tarjan, A Data Structure for Dynamic Trees, Journal of Computer and System Sciences, Volume 26 Issue 3, June 1983, pp. 362 – 391  Daniel D. Sleator and Robert E. Tarjan, Self-adjusting binary search trees, Journal of the ACM, Volume 32 Issue 3, July 1985, pp. 652 – 686

Slide 277

Slide 277 text

277 / 277 0 2 4 6 8 10 12 0 10 20 30 40 50 60 70 80 90 100