ac-library-rb 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/unittest.yml +16 -0
- data/.gitignore +11 -0
- data/.rubocop.yml +198 -0
- data/Gemfile +3 -0
- data/LICENSE +116 -0
- data/README.ja.md +56 -0
- data/README.md +41 -0
- data/Rakefile +11 -0
- data/ac-library-rb.gemspec +32 -0
- data/bin/console +8 -0
- data/bin/lock_lib.rb +27 -0
- data/bin/setup +8 -0
- data/document_en/binary_index_tree.md +3 -0
- data/document_en/convolution.md +67 -0
- data/document_en/dsu.md +132 -0
- data/document_en/fenwick_tree.md +99 -0
- data/document_en/index.md +79 -0
- data/document_en/lazy_segtree.md +141 -0
- data/document_en/math.md +104 -0
- data/document_en/max_flow.md +165 -0
- data/document_en/min_cost_flow.md +132 -0
- data/document_en/modint.md +263 -0
- data/document_en/priority_queue.md +119 -0
- data/document_en/segtree.md +134 -0
- data/document_en/string.md +106 -0
- data/document_en/two_sat.md +91 -0
- data/document_en/union_find.md +3 -0
- data/document_ja/convolution.md +64 -0
- data/document_ja/dsu.md +183 -0
- data/document_ja/fenwick_tree.md +83 -0
- data/document_ja/index.md +89 -0
- data/document_ja/lazy_segtree.md +135 -0
- data/document_ja/math.md +116 -0
- data/document_ja/max_flow.md +129 -0
- data/document_ja/min_cost_flow.md +105 -0
- data/document_ja/modint.md +349 -0
- data/document_ja/priority_queue.md +103 -0
- data/document_ja/scc.md +65 -0
- data/document_ja/segtree.md +145 -0
- data/document_ja/string.md +105 -0
- data/document_ja/two_sat.md +87 -0
- data/lib/ac-library-rb/version.rb +3 -0
- data/lib/convolution.rb +124 -0
- data/lib/core_ext/modint.rb +19 -0
- data/lib/crt.rb +52 -0
- data/lib/dsu.rb +44 -0
- data/lib/fenwick_tree.rb +48 -0
- data/lib/floor_sum.rb +21 -0
- data/lib/inv_mod.rb +26 -0
- data/lib/lazy_segtree.rb +149 -0
- data/lib/lcp_array.rb +23 -0
- data/lib/max_flow.rb +137 -0
- data/lib/min_cost_flow.rb +143 -0
- data/lib/modint.rb +170 -0
- data/lib/pow_mod.rb +13 -0
- data/lib/priority_queue.rb +89 -0
- data/lib/scc.rb +77 -0
- data/lib/segtree.rb +140 -0
- data/lib/suffix_array.rb +128 -0
- data/lib/two_sat.rb +34 -0
- data/lib/z_algorithm.rb +32 -0
- data/lib_helpers/ac-library-rb/all.rb +22 -0
- data/lib_lock/ac-library-rb.rb +22 -0
- data/lib_lock/ac-library-rb/convolution.rb +126 -0
- data/lib_lock/ac-library-rb/core_ext/modint.rb +19 -0
- data/lib_lock/ac-library-rb/crt.rb +54 -0
- data/lib_lock/ac-library-rb/dsu.rb +46 -0
- data/lib_lock/ac-library-rb/fenwick_tree.rb +50 -0
- data/lib_lock/ac-library-rb/floor_sum.rb +23 -0
- data/lib_lock/ac-library-rb/inv_mod.rb +28 -0
- data/lib_lock/ac-library-rb/lazy_segtree.rb +151 -0
- data/lib_lock/ac-library-rb/lcp_array.rb +25 -0
- data/lib_lock/ac-library-rb/max_flow.rb +139 -0
- data/lib_lock/ac-library-rb/min_cost_flow.rb +145 -0
- data/lib_lock/ac-library-rb/modint.rb +172 -0
- data/lib_lock/ac-library-rb/pow_mod.rb +15 -0
- data/lib_lock/ac-library-rb/priority_queue.rb +91 -0
- data/lib_lock/ac-library-rb/scc.rb +79 -0
- data/lib_lock/ac-library-rb/segtree.rb +142 -0
- data/lib_lock/ac-library-rb/suffix_array.rb +130 -0
- data/lib_lock/ac-library-rb/two_sat.rb +36 -0
- data/lib_lock/ac-library-rb/z_algorithm.rb +34 -0
- metadata +158 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
# Fenwick Tree
|
2
|
+
|
3
|
+
**別名** BIT(Binary Indexed Tree)
|
4
|
+
|
5
|
+
長さ `N` の配列に対し、
|
6
|
+
|
7
|
+
- 要素の `1` 点変更
|
8
|
+
- 区間の要素の総和
|
9
|
+
|
10
|
+
を `O(logN)` で求めることが出来るデータ構造です。
|
11
|
+
|
12
|
+
## 特異メソッド
|
13
|
+
|
14
|
+
### new(n) -> FenwickTree
|
15
|
+
### new(ary) -> FenwickTree
|
16
|
+
|
17
|
+
```rb
|
18
|
+
fw = FenwickTree.new(arg)
|
19
|
+
```
|
20
|
+
|
21
|
+
引数は、`Integer` または `Array` です。
|
22
|
+
|
23
|
+
1. 引数が `Integer` クラスの `n` のとき、長さ `n` の全ての要素が `0` で初期化された配列を作ります。
|
24
|
+
2. 引数が長さ `n` の `Array` クラスの配列 `a` のとき、`a` で初期化された配列を作ります。
|
25
|
+
|
26
|
+
配列の添字は、0-based indexです。
|
27
|
+
|
28
|
+
**計算量**
|
29
|
+
|
30
|
+
`O(n)` (引数が`Array`でも同じです)
|
31
|
+
|
32
|
+
## add(pos, x)
|
33
|
+
|
34
|
+
```rb
|
35
|
+
fw.add(pos, x)
|
36
|
+
```
|
37
|
+
|
38
|
+
`a[pos] += x`を行います。
|
39
|
+
|
40
|
+
`pos`は、0-based indexです。
|
41
|
+
|
42
|
+
**制約** `0 ≦ pos < n`
|
43
|
+
**計算量** `O(logn)`
|
44
|
+
|
45
|
+
## sum(l, r) ->Integer
|
46
|
+
|
47
|
+
```rb
|
48
|
+
fw.sum(l, r)
|
49
|
+
```
|
50
|
+
|
51
|
+
`a[l] + a[l - 1] + ... + a[r - 1]`を返します。
|
52
|
+
|
53
|
+
引数は、半開区間です。
|
54
|
+
|
55
|
+
実装として、内部で`_sum(r) - _sum(l)`を返しています。
|
56
|
+
|
57
|
+
**制約** `0 ≦ l ≦ r ≦ n`
|
58
|
+
**計算量** `O(logn)`
|
59
|
+
|
60
|
+
## _sum(pos) -> Integer
|
61
|
+
|
62
|
+
```rb
|
63
|
+
fw._sum(pos)
|
64
|
+
```
|
65
|
+
|
66
|
+
`a[0] + a[1] + ... + a[pos - 1]`を返します。
|
67
|
+
|
68
|
+
**計算量** `O(logn)`
|
69
|
+
|
70
|
+
## Verified
|
71
|
+
|
72
|
+
- [AtCoder ALPC B \- Fenwick Tree](https://atcoder.jp/contests/practice2/tasks/practice2_b)
|
73
|
+
[ACコード(17074108)]https://atcoder.jp/contests/practice2/submissions/17074108 (1272ms)
|
74
|
+
- [F \- Range Xor Query](https://atcoder.jp/contests/abc185/tasks/abc185_f)
|
75
|
+
FenwickTree(BIT)をxorに改造するだけでも解けます。
|
76
|
+
[ACコード(821ms)](https://atcoder.jp/contests/abc185/submissions/18769200)。FenwickTree(BIT)のxor改造版です。
|
77
|
+
|
78
|
+
|
79
|
+
## 開発者、内部実装を読みたい人向け
|
80
|
+
|
81
|
+
本家ACLライブラリの実装は、内部の配列も0-based indexですが、
|
82
|
+
|
83
|
+
本ライブラリは定数倍改善のため、内部の配列への添字が1-based indexです。
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# index
|
2
|
+
|
3
|
+
`lib`ディレクトリにコードがあります。
|
4
|
+
|
5
|
+
現状、この中から探してもらって、コピペして使って下さい。
|
6
|
+
|
7
|
+
左の列から、コード本体、ドキュメントです。
|
8
|
+
|
9
|
+
(ドキュメントのGはGitHubにあるという意味で、HackMDに移す計画があるためです)
|
10
|
+
|
11
|
+
| C | D | |
|
12
|
+
| :--- | :--- | --- |
|
13
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/fenwick_tree.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/fenwick_tree.md) |FenwickTree(BIT)|
|
14
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/segtree.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/segtree.md) |Segtree|
|
15
|
+
| [○](https://github.com/universato/ac-library-rb/blob/master/lib/lazy_segtree.rb) | [○G](https://github.com/universato/ac-library-rb/blob/master/document_ja/lazy_segtree.md) |LazySegtree|
|
16
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/priority_queue.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/priority_queue.md) |PriorityQueue|
|
17
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/suffix_array.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/string.md) |suffix_array|
|
18
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/lcp_array.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/string.md) |lcp_array|
|
19
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/z_algorithm.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/string.md) |z_algorithm|
|
20
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/pow_mod.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/math.md) |pow_mod|
|
21
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/inv_mod.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/math.md) |inv_mod|
|
22
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/crt.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/math.md) |crt(中国剰余定理)|
|
23
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/floor_sum.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/math.md) |floor_sum|
|
24
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/convolution.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/convolution.md) |convolution|
|
25
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/modint.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/modint.md) |ModInt|
|
26
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/dsu.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/dsu.md) |DSU(UnionFind)|
|
27
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/max_flow.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/max_flow.md) |MaxFlow|
|
28
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/min_cost_flow.rb) |[◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/min_cost_flow.md) |MinCostFlow|
|
29
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/scc.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/scc.md) |SCC(強連結成分)|
|
30
|
+
| [◎](https://github.com/universato/ac-library-rb/blob/master/lib/two_sat.rb) | [◎G](https://github.com/universato/ac-library-rb/blob/master/document_ja/two_sat.md) |TwoSat|
|
31
|
+
|
32
|
+
## 実装コードへのリンク(GitHub)
|
33
|
+
|
34
|
+
上の表の別形式です。
|
35
|
+
|
36
|
+
### データ構造
|
37
|
+
|
38
|
+
- [fenwick_tree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/fenwick_tree.rb)
|
39
|
+
- [segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/segtree.rb)
|
40
|
+
- [lazy_segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/lazy_segtree.rb)
|
41
|
+
- [priority_queue.rb](https://github.com/universato/ac-library-rb/blob/master/lib/priority_queue.rb)
|
42
|
+
- String
|
43
|
+
- [suffix_array.rb](https://github.com/universato/ac-library-rb/blob/master/lib/suffix_array.rb)
|
44
|
+
- [lcp_array.rb](https://github.com/universato/ac-library-rb/blob/master/lib/lcp_array.rb)
|
45
|
+
- [z_algorithm.rb](https://github.com/universato/ac-library-rb/blob/master/lib/z_algorithm.rb)
|
46
|
+
|
47
|
+
### 数学
|
48
|
+
|
49
|
+
- math
|
50
|
+
- [pow_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/pow_mod.rb)
|
51
|
+
- [inv_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/inv_mod.rb)
|
52
|
+
- [crt.rb](https://github.com/universato/ac-library-rb/blob/master/lib/crt.rb)
|
53
|
+
- [floor_sum.rb](https://github.com/universato/ac-library-rb/blob/master/lib/floor_sum.rb)
|
54
|
+
- [convolution.rb](https://github.com/universato/ac-library-rb/blob/master/lib/convolution.rb)
|
55
|
+
- [modint.rb](https://github.com/universato/ac-library-rb/blob/master/lib/modint.rb)
|
56
|
+
|
57
|
+
### グラフ
|
58
|
+
|
59
|
+
- [dsu.rb](https://github.com/universato/ac-library-rb/blob/master/lib/dsu.rb)
|
60
|
+
- [max_flow.rb](https://github.com/universato/ac-library-rb/blob/master/lib/max_flow.rb)
|
61
|
+
- [min_cost_flow.rb](https://github.com/universato/ac-library-rb/blob/master/lib/min_cost_flow.rb)
|
62
|
+
- [scc.rb](https://github.com/universato/ac-library-rb/blob/master/lib/scc.rb)
|
63
|
+
- [two_sat.rb](https://github.com/universato/ac-library-rb/blob/master/lib/two_sat.rb)
|
64
|
+
|
65
|
+
## アルファベット順(辞書順)
|
66
|
+
|
67
|
+
<details>
|
68
|
+
<summary>アルファベット順(辞書順)の一覧</summary>
|
69
|
+
|
70
|
+
[convolution.rb](https://github.com/universato/ac-library-rb/blob/master/lib/convolution.rb)
|
71
|
+
[crt.rb](https://github.com/universato/ac-library-rb/blob/master/lib/crt.rb)
|
72
|
+
[dsu.rb](https://github.com/universato/ac-library-rb/blob/master/lib/dsu.rb)
|
73
|
+
[fenwick_tree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/fenwick_tree.rb)
|
74
|
+
[floor_sum.rb](https://github.com/universato/ac-library-rb/blob/master/lib/floor_sum..rb)
|
75
|
+
[inv_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/inv_mod.rb)
|
76
|
+
[lazy_segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/lazy_segtree.rb)
|
77
|
+
[lcp_array.rb](https://github.com/universato/ac-library-rb/blob/master/lib/lcp_array.rb)
|
78
|
+
[max_flow.rb](https://github.com/universato/ac-library-rb/blob/master/lib/max_flow.rb)
|
79
|
+
[min_cost_flow.rb](https://github.com/universato/ac-library-rb/blob/master/lib/min_cost_flow.rb)
|
80
|
+
[modint.rb](https://github.com/universato/ac-library-rb/blob/master/lib/modint.rb)
|
81
|
+
[pow_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/pow_mod.rb)
|
82
|
+
[priority_queue.rb](https://github.com/universato/ac-library-rb/blob/master/lib/priority_queue.rb)
|
83
|
+
[scc.rb](https://github.com/universato/ac-library-rb/blob/master/lib/scc.rb)
|
84
|
+
[segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/segtree.rb)
|
85
|
+
[suffix_array.rb](https://github.com/universato/ac-library-rb/blob/master/lib/suffix_array.rb)
|
86
|
+
[two_sat.rb](https://github.com/universato/ac-library-rb/blob/master/lib/two_sat.rb)
|
87
|
+
[z_algorithm.rb](https://github.com/universato/ac-library-rb/blob/master/lib/z_algorithm.rb)
|
88
|
+
|
89
|
+
</details>
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# LazySegtree
|
2
|
+
|
3
|
+
遅延評価セグメントツリーです。
|
4
|
+
|
5
|
+
この命名には批判があって、遅延伝播セグメントツリーの方が良いという意見も根強いです。
|
6
|
+
|
7
|
+
宗教戦争を避けるために、遅延セグ木と呼ぶのがいいかもしれません。
|
8
|
+
|
9
|
+
## 特異メソッド
|
10
|
+
|
11
|
+
### new(v, e, id, op, mapping, composition)
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
seg = LazySegtree.new(v, e, id, op, mapping, compositon)
|
15
|
+
```
|
16
|
+
|
17
|
+
第1引数は、`Integer`または`Array`です。
|
18
|
+
|
19
|
+
- 第1引数が`Integer`の`n`のとき、長さ`n`・初期値`e`のセグメント木を作ります。
|
20
|
+
- 第1引数が長さ`n`の`Array`の`a`のとき、`a`をもとにセグメント木を作ります。
|
21
|
+
|
22
|
+
第2引数`e`は、単位元です。ブロックで二項演算`op(x, y)`を定義することで、モノイドを定義する必要があります。
|
23
|
+
|
24
|
+
**計算量** `O(n)`
|
25
|
+
|
26
|
+
## インスタンスメソッド
|
27
|
+
|
28
|
+
### set(pos, x)
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
seg.set(pos, x)
|
32
|
+
```
|
33
|
+
|
34
|
+
`a[pos]`に`x`を代入します。
|
35
|
+
|
36
|
+
**計算量** `O(logn)`
|
37
|
+
|
38
|
+
|
39
|
+
### get(pos) -> 単位元eと同じクラス
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
seg.get(pos)
|
43
|
+
```
|
44
|
+
|
45
|
+
`a[pos]`を返します。
|
46
|
+
|
47
|
+
**計算量** `O(1)`
|
48
|
+
|
49
|
+
|
50
|
+
### prod(l, r) -> 単位元eと同じクラス
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
seg.prod(l, r)
|
54
|
+
```
|
55
|
+
|
56
|
+
`op(a[l], ..., a[r - 1])` を返します。
|
57
|
+
|
58
|
+
**制約** `0 ≦ l ≦ r ≦ n`
|
59
|
+
|
60
|
+
**計算量** `O(logn)`
|
61
|
+
|
62
|
+
### all_prod -> 単位元eと同じクラス
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
seg.all_prod
|
66
|
+
```
|
67
|
+
|
68
|
+
`op(a[0], ..., a[n - 1])` を返します。
|
69
|
+
|
70
|
+
**計算量** `O(1)`
|
71
|
+
|
72
|
+
### apply(pos, val)
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
seg.apply(pos, val)
|
76
|
+
```
|
77
|
+
|
78
|
+
本家コードで引数が3つのとき実装について、当ライブラリでは`range_apply`という名称で実装しています。実行時間を計測して問題なさそうなら、`apply`メソッドに2引数と3引数の両方に対応できるようにします。
|
79
|
+
|
80
|
+
**制約** `0 ≦ pos < n`
|
81
|
+
|
82
|
+
**計算量** `O(log n)`
|
83
|
+
|
84
|
+
### range_apply(l, r, val)
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
seg.range_apply(l, r, val)
|
88
|
+
```
|
89
|
+
|
90
|
+
**制約** `0 ≦ l ≦ r ≦ n`
|
91
|
+
|
92
|
+
**計算量** `O(log n)`
|
93
|
+
|
94
|
+
### max_right
|
95
|
+
|
96
|
+
[TODO] 暇な誰かが書く。
|
97
|
+
|
98
|
+
### min_left
|
99
|
+
|
100
|
+
[TODO] コード側の実装ができていないです。
|
101
|
+
|
102
|
+
## Verified
|
103
|
+
|
104
|
+
問題のリンクです。コードはないですが、Verified済みです。
|
105
|
+
- [AIZU ONLINE JUDGE DSL\_2\_F RMQ and RUQ](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_F)
|
106
|
+
- [AIZU ONLINE JUDGE DSL\_2\_G RSQ and RAQ](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_G)
|
107
|
+
|
108
|
+
以下の問題は、Rubyでは実行時間が厳しくTLEになりACできてないです。
|
109
|
+
- [ALPC: K \- Range Affine Range Sum](https://atcoder.jp/contests/practice2/tasks/practice2_k)
|
110
|
+
- [ALPC: L \- Lazy Segment Tree](https://atcoder.jp/contests/practice2/tasks/practice2_l)
|
111
|
+
|
112
|
+
## 参考リンク
|
113
|
+
|
114
|
+
- 当ライブラリ
|
115
|
+
- [当ライブラリの実装コード lazy_segtree.rb](https://github.com/universato/ac-library-rb/blob/master/lib/lazy_segtree.rb)
|
116
|
+
- [当ライブラリのテストコード lazy_segtree_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/lazy_segtree_test.rb)
|
117
|
+
- 本家ライブラリ
|
118
|
+
- [本家ライブラリのドキュメント lazysegtree.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_ja/lazysegtree.md)
|
119
|
+
- [本家のドキュメント appendix.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_ja/appendix.md)
|
120
|
+
- [本家ライブラリの実装コード lazysegtree.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/lazysegtree.hpp)
|
121
|
+
- [本家ライブラリのテストコード lazysegtree_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/unittest/lazysegtree_test.cpp)
|
122
|
+
- セグメントツリーについて
|
123
|
+
- [セグメント木をソラで書きたいあなたに \- hogecoder](https://tsutaj.hatenablog.com/entry/2017/03/29/204841)
|
124
|
+
- [遅延評価セグメント木をソラで書きたいあなたに \- hogecoder](https://tsutaj.hatenablog.com/entry/2017/03/30/224339)
|
125
|
+
- AtCooderLibrary(ACL)のLazySegtreeについて
|
126
|
+
- [使い方 \- ARMERIA 2020/9/22](https://betrue12.hateblo.jp/entry/2020/09/22/194541)
|
127
|
+
- [チートシート \- ARMERIA 2020/9/23](https://betrue12.hateblo.jp/entry/2020/09/23/005940)
|
128
|
+
- [ACLPC: K–Range Affine Range Sumの解説 \|optのブログ 2020/9/27](https://opt-cp.com/cp/lazysegtree-aclpc-k/)
|
129
|
+
- [ACL 基礎実装例集 \- buyoh\.hateblo\.jp 2020/9/27](https://buyoh.hateblo.jp/entry/2020/09/27/190144)
|
130
|
+
|
131
|
+
## 本家ライブラリとの違い
|
132
|
+
|
133
|
+
### `ceil_pow2`ではなく、`bit_length`
|
134
|
+
|
135
|
+
本家C++ライブラリは独自定義の`internal::ceil_pow2`関数を用いてますが、本ライブラリではRuby既存のメソッド`Integer#bit_length`を用いています。そちらの方が計測した結果、高速でした。
|
data/document_ja/math.md
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# Math
|
2
|
+
|
3
|
+
数学的アルゴリズムの詰め合わせです。
|
4
|
+
|
5
|
+
- `pow_mod`
|
6
|
+
- `inv_mod`
|
7
|
+
- `crt`
|
8
|
+
- `floor_sum`
|
9
|
+
|
10
|
+
## pow_mod
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
pow_mod(x, n, m)
|
14
|
+
```
|
15
|
+
|
16
|
+
`(x**n) % m` を返します。
|
17
|
+
|
18
|
+
Rubyには、もともと `Integer#pow` があるため、そちらを利用した方がいいです。
|
19
|
+
|
20
|
+
基本的に、`pow_mod(x, n, m)` は、 `x.pow(n, m)`と等しいです。
|
21
|
+
|
22
|
+
ただ、Ruby 2.7.1の時点で、`Integer#pow` は、`x.pow(0, 1)`で「mod 1」なのに `1` を返す小さなバグがあります。
|
23
|
+
|
24
|
+
**制約**
|
25
|
+
|
26
|
+
- 引数`n`, `m`は、整数。
|
27
|
+
- `0 ≦ n`, `1 ≦ m`
|
28
|
+
|
29
|
+
**計算量**
|
30
|
+
|
31
|
+
- `O(log n)`
|
32
|
+
|
33
|
+
## inv_mod
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
inv_mod(x, n, m)
|
37
|
+
```
|
38
|
+
|
39
|
+
`xy ≡ 1 (mod m)` なる `y` のうち、`0 ≦ y < m` を満たすものを返します。
|
40
|
+
|
41
|
+
mが素数のとき、フェルマーの小定理より `x.pow(m - 2, m)` を使えます。
|
42
|
+
|
43
|
+
**制約**
|
44
|
+
|
45
|
+
- `gcd(x, m) = 1`, `1 ≦ m`
|
46
|
+
|
47
|
+
**計算量**
|
48
|
+
|
49
|
+
- `O(log m)`
|
50
|
+
|
51
|
+
### Verified
|
52
|
+
- [ABC186 E - Throne](https://atcoder.jp/contests/abc186/tasks/abc186_e)
|
53
|
+
[ACコード(59ms) 2020/12/20](https://atcoder.jp/contests/abc186/submissions/18898186)
|
54
|
+
|
55
|
+
## crt(r, m) -> [rem , mod] or [0, 0]
|
56
|
+
|
57
|
+
中国剰余定理
|
58
|
+
Chinese remainder theorem
|
59
|
+
|
60
|
+
同じ長さ`n`の配列`r`, `m`を渡したとき、
|
61
|
+
|
62
|
+
`x ≡ r[i] (mod m[i]), ∀i ∈ {0, 1, …… n - 1}`
|
63
|
+
|
64
|
+
を解きます。答えが存在するとき、`x ≡ rem(mod)`という形で書け、
|
65
|
+
|
66
|
+
答えが存在するとき、`[rem ,mod]`を返します。
|
67
|
+
|
68
|
+
答えがないとき、`[0, 0]`を返します。
|
69
|
+
|
70
|
+
### Verified
|
71
|
+
|
72
|
+
問題
|
73
|
+
- [No\.187 中華風 \(Hard\) \- yukicoder](https://yukicoder.me/problems/no/187)
|
74
|
+
|
75
|
+
## floor_sum(n, m, a, b)
|
76
|
+
|
77
|
+
$\sum_{i = 0}^{n - 1} \mathrm{floor}(\frac{a \times i + b}{m})$
|
78
|
+
|
79
|
+
`Σ[k = 0 → n - 1] floow((a * i + b) / m)`
|
80
|
+
|
81
|
+
を計算量を工夫して計算して返します。
|
82
|
+
|
83
|
+
**計算量**
|
84
|
+
|
85
|
+
- `O(log(n + m + a + b))`
|
86
|
+
|
87
|
+
### Verified
|
88
|
+
|
89
|
+
[ALPC: C \- Floor Sum](https://atcoder.jp/contests/practice2/tasks/practice2_c)
|
90
|
+
- [ACコード 426ms 2020/9/14](https://atcoder.jp/contests/practice2/submissions/16735215)
|
91
|
+
|
92
|
+
## 参考リンク
|
93
|
+
|
94
|
+
- 当ライブラリ
|
95
|
+
- 当ライブラリの実装コード
|
96
|
+
- [当ライブラリの実装コード pow_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/pow_mod.rb)
|
97
|
+
- [当ライブラリの実装コード inv_mod.rb](https://github.com/universato/ac-library-rb/blob/master/lib/inv_mod.rb)
|
98
|
+
- [当ライブラリの実装コード crt.rb](https://github.com/universato/ac-library-rb/blob/master/lib/crt.rb)
|
99
|
+
- [当ライブラリの実装コード floor_sum.rb](https://github.com/universato/ac-library-rb/blob/master/lib/floor_sum.rb)
|
100
|
+
- テストコード
|
101
|
+
- [当ライブラリのテストコード pow_mod_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/pow_mod.rb)
|
102
|
+
- [当ライブラリのテストコード inv_mod_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/inv_mod.rb)
|
103
|
+
- [当ライブラリのテストコード crt_test.rb](https://github.com/universato/ac-library-rb/blob/master/test/crt.rb)
|
104
|
+
- [当ライブラリのテストコード floor_sum_test.rb](https://github.com/universato/ac-library-rb/test/master/lib/floor_sum.rb)
|
105
|
+
- 本家ライブラリ
|
106
|
+
- [本家ライブラリの実装コード math.hpp](https://github.com/atcoder/ac-library/blob/master/atcoder/math.hpp)
|
107
|
+
- [本家ライブラリの実装コード internal_math.hpp](https://github.com/atcoder/ac-library/blob/master/atcoder/internal_math.hpp)
|
108
|
+
- [本家ライブラリのテストコード math_test.cpp](https://github.com/atcoder/ac-library/blob/master/test/unittest/math_test.cpp)
|
109
|
+
- [本家ライブラリのドキュメント math.md](https://github.com/atcoder/ac-library/blob/master/document_ja/math.md)
|
110
|
+
- [Relax the constraints of floor\_sum? · Issue \#33 · atcoder/ac\-library](https://github.com/atcoder/ac-library/issues/33)
|
111
|
+
|
112
|
+
## Q&A
|
113
|
+
|
114
|
+
### ファイルは個別なの?
|
115
|
+
|
116
|
+
本家側に合わせて`math`ファイルなどにまとめてもいいかもしれないです。
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# MaxFlow
|
2
|
+
|
3
|
+
最大フロー問題を解くライブラリです。
|
4
|
+
|
5
|
+
## 特異メソッド
|
6
|
+
|
7
|
+
### new(n = 0) -> MaxFlow
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
graph = Maxflow.new(10)
|
11
|
+
```
|
12
|
+
|
13
|
+
n頂点0辺のグラフを作ります。
|
14
|
+
|
15
|
+
頂点の番号は、0-based indexです。
|
16
|
+
|
17
|
+
## インスタンスメソッド
|
18
|
+
|
19
|
+
### add_edge(from, to, cap) -> Integer
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
graph.add_edge(0, 1, 5)
|
23
|
+
```
|
24
|
+
|
25
|
+
頂点`from`から頂点`to`への最大容量`cap`, 流量`0`の辺を追加します。
|
26
|
+
|
27
|
+
返り値は、0-based indexで何番目に追加された辺かを返します。
|
28
|
+
|
29
|
+
### flow(start, to, flow_limit = 1 << 64) -> Integer
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
(1) graph.flow(0, 3)
|
33
|
+
(2) graph.flow(0, 3, flow_limit)
|
34
|
+
```
|
35
|
+
|
36
|
+
**エイリアス** `max_flow`, `flow`
|
37
|
+
|
38
|
+
### min_cut(start) -> Array(boolean)
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
graph.min_cut(start)
|
42
|
+
```
|
43
|
+
|
44
|
+
返り値は、長さ`n`の配列。
|
45
|
+
|
46
|
+
返り値の`i`番目の要素には、頂点`start`から`i`へ残余グラフで到達可能なときに`true`が入り、そうでない場合に`false`が入る。
|
47
|
+
|
48
|
+
**計算量** `O(n + m)` ※ `m`は辺数
|
49
|
+
|
50
|
+
### get_edge(i) -> [from, to, cap, flow]
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
graph.get_edge(i)
|
54
|
+
graph.edge(i)
|
55
|
+
graph[i]
|
56
|
+
```
|
57
|
+
|
58
|
+
辺の状態を返します。
|
59
|
+
|
60
|
+
**計算量** `O(1)`
|
61
|
+
|
62
|
+
**エイリアス** `get_edge`, `edge`, `[]`
|
63
|
+
|
64
|
+
### edges -> Array([from, to, cap, flow])
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
graph.edges
|
68
|
+
```
|
69
|
+
|
70
|
+
全ての辺の情報を含む配列を返します。
|
71
|
+
|
72
|
+
**計算量** `O(m)` ※`m`は辺数です。
|
73
|
+
|
74
|
+
#### `edges`メソッドの注意点
|
75
|
+
|
76
|
+
`edges`メソッドは全ての辺の情報を生成するため、`O(m)`です。
|
77
|
+
|
78
|
+
生成コストがあるため、`get_edge(i)`を用いる方法や、`edges = graph.edges`と一度別の変数に格納する方法も考慮してください。
|
79
|
+
|
80
|
+
### change_edge(i, new_cap, new_flow)
|
81
|
+
|
82
|
+
`i`番目に変更された辺の容量、流量を`new_cap`, `new_flow`に変更します。
|
83
|
+
|
84
|
+
**制約** `0 ≦ new_fow ≦ new_cap`
|
85
|
+
|
86
|
+
**計算量** `O(1)`
|
87
|
+
|
88
|
+
## Verified
|
89
|
+
|
90
|
+
[ALPC: D \- Maxflow](https://atcoder.jp/contests/practice2/tasks/practice2_d)
|
91
|
+
- [ACコード 211ms 2020/9/17](https://atcoder.jp/contests/practice2/submissions/16789801)
|
92
|
+
- [ALPC: D解説 \- Qiita](https://qiita.com/magurofly/items/bfaf6724418bfde86bd0)
|
93
|
+
|
94
|
+
## 参考リンク
|
95
|
+
|
96
|
+
- 当ライブラリ
|
97
|
+
- [当ライブラリの実装コード max_flow.rb(GitHub)](https://github.com/universato/ac-library-rb/blob/master/lib/max_flow.rb)
|
98
|
+
- [当ライブラリのテストコード max_flow_test.rb(GitHub)](https://github.com/universato/ac-library-rb/blob/master/test/max_flow_test.rb)
|
99
|
+
- 本家ライブラリ
|
100
|
+
- 本家のコード
|
101
|
+
- [本家の実装コード maxflow.hpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/atcoder/maxflow.hpp)
|
102
|
+
- [本家のテストコード maxflow_test.cpp(GitHub)](https://github.com/atcoder/ac-library/blob/master/test/unittest/maxflow_test.cpp)
|
103
|
+
- 本家ドキュメント
|
104
|
+
- [本家のドキュメント maxflow.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_ja/maxflow.md)
|
105
|
+
- [本家のドキュメント appendix.md(GitHub)](https://github.com/atcoder/ac-library/blob/master/document_ja/appendix.md)
|
106
|
+
|
107
|
+
## Q&A
|
108
|
+
|
109
|
+
### `flow`メソッドの`flow_limit`のデフォルトは 何故`1 << 64`
|
110
|
+
|
111
|
+
記憶になく、深い意味はないです。
|
112
|
+
`Float::MAX`や`Float::INFINITY`でも良さそうですが、遅くならないでしょうか。
|
113
|
+
|
114
|
+
### 辺にStructは使わないの
|
115
|
+
|
116
|
+
Structを使った方がコードがスリムになって上級者ぽくもあり見栄えは良いです。
|
117
|
+
|
118
|
+
しかし、計測した結果、Strucだと遅いので、配列を使用しています。
|
119
|
+
|
120
|
+
### `_`始まりの変数の意図は
|
121
|
+
|
122
|
+
ちょっと紛らわしいのですが、別々に2種類の意図があります。
|
123
|
+
|
124
|
+
1. `_e`や`_re`は、本家ACLコードと一緒に読みやすいように、変数名を合わせています。
|
125
|
+
2. `_rev`は、`each`で回す都合上吐き出すけれど使わないので、「使わない」という意図で`_`始まりにしています。
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
@g[q].each do |(to, _rev, cap)|
|
129
|
+
```
|