回答編集履歴

2

誤りは言い過ぎだった

2021/07/18 21:05

投稿

actorbug
actorbug

スコア2431

test CHANGED
@@ -16,9 +16,9 @@
16
16
 
17
17
  遅延セグメント木の更新処理を勘違いしています。
18
18
 
19
+ (検索して見つかる図が処理途中段階のものが多いで仕方ないかもしれませんが)
20
+
19
21
  更新範囲内で最も葉に近いノードのみ更新するわけではなく、その親も一通り更新します。
20
-
21
- (検索して見つかる図が間違ってるので仕方ないかもしれませんが)
22
22
 
23
23
 
24
24
 

1

コメントを受けて追記

2021/07/18 21:05

投稿

actorbug
actorbug

スコア2431

test CHANGED
@@ -9,3 +9,109 @@
9
9
  ```
10
10
 
11
11
  とりあえず、最後の条件を削除したうえで、正常動作するように調整すべきだと思われます。
12
+
13
+
14
+
15
+ #追記
16
+
17
+ 遅延セグメント木の更新処理を勘違いしています。
18
+
19
+ 更新範囲内で最も葉に近いノードのみ更新するわけではなく、その親も一通り更新します。
20
+
21
+ (検索して見つかる図が間違ってるので仕方ないかもしれませんが)
22
+
23
+
24
+
25
+ 追記の例だと、更新結果は通常のセグメント木と結果は変わりません。(`<>`が参照・更新されたノード)
26
+
27
+ ```text
28
+
29
+ [ 配列(_tree)/遅延評価用配列(_lazy_tree) ]
30
+
31
+ /*--------------------------------------------*/
32
+
33
+ 例:
34
+
35
+ [ 2/- ]
36
+
37
+ [ 3/- ] [ 2/- ]
38
+
39
+ [ 4/- ] [ 3/- ] [ 2/- ] [ 5/- ]
40
+
41
+ [4/-] [5/-] [3/-] [6/-] [2/-] [3/-] [8/-] [5/-]
42
+
43
+
44
+
45
+ 区間[4,5)を1に更新
46
+
47
+ < 1/- >
48
+
49
+ [ 3/- ] < 1/- >
50
+
51
+ [ 4/- ] [ 3/- ] < 1/- > [ 5/- ]
52
+
53
+ [4/-] [5/-] [3/-] [6/-] <1/-> [3/-] [8/-] [5/-]
54
+
55
+
56
+
57
+ 区間[4,8)の最小値を求める
58
+
59
+ < 1/- >
60
+
61
+ [ 3/- ] < 1/- >
62
+
63
+ [ 4/- ] [ 3/- ] [ 1/- ] [ 5/- ]
64
+
65
+ [4/-] [5/-] [3/-] [6/-] [1/-] [3/-] [8/-] [5/-]
66
+
67
+ ```
68
+
69
+
70
+
71
+ 更新も範囲でないと遅延木の効果は見えません。
72
+
73
+ ```text
74
+
75
+ [ 配列(_tree)/遅延評価用配列(_lazy_tree) ]
76
+
77
+ /*--------------------------------------------*/
78
+
79
+ 例:
80
+
81
+ [ 2/- ]
82
+
83
+ [ 3/- ] [ 2/- ]
84
+
85
+ [ 4/- ] [ 3/- ] [ 2/- ] [ 5/- ]
86
+
87
+ [4/-] [5/-] [3/-] [6/-] [2/-] [3/-] [8/-] [5/-]
88
+
89
+
90
+
91
+ 区間[3,8)を1に更新
92
+
93
+ < 1/- >
94
+
95
+ < 1/- > < 1/- >
96
+
97
+ [ 4/- ] < 1/- > < 2/1 > < 5/1 >
98
+
99
+ [4/-] [5/-] [3/-] <1/-> [2/-] [3/-] [8/-] [5/-]
100
+
101
+
102
+
103
+ 区間[4,6)の最小値を求める
104
+
105
+ < 1/- >
106
+
107
+ [ 1/- ] < 1/- >
108
+
109
+ [ 4/- ] [ 1/- ] < 1/- > [ 5/1 ]
110
+
111
+ [4/-] [5/-] [3/-] [1/-] <2/1> <3/1> [8/-] [5/-]
112
+
113
+ ```
114
+
115
+ [4,8)のノードではなく、その子のノードが遅延されるのは、
116
+
117
+ [4,8)のノードの値が[0,8)のノードの値の計算に必要だからです。