SlideShare a Scribd company logo
1 of 66
Download to read offline
HCPCHCPC 勉強会勉強会 (2016/12/13)(2016/12/13)
「「Binary Indexed TreeBinary Indexed Tree」」
北海道大学情報エレクトロニクス学科
情報理工学コースB3 杉江祐哉
Binary Indexed Tree #Binary Indexed Tree #とはとは
次のことが実現できるデータ構造!
●
i が与えられたとき、
累積和 a1
+ a2
+ … + ai
を計算
● i と x が与えられたとき、ai
に x を足す
セグメント木による表現セグメント木による表現
●
これはセグメント木でも実現できる!
5 3 7 9 6 4 1 2
8 16 10 3
24 13
37
各節点は、対応する区間の和を持っている
計算クエリ計算クエリ
●
区間を完全に被覆するまで下がっていく
(例) a1
+ a2
+ … + a7
5 3 7 9 6 4 1 2
8 16 10 3
24 13
37
24 + 10 + 1 = 35 が答え!
更新クエリ更新クエリ
●
関係ある区間を更新していく
(例) a1
を 5 から 2 に変える (-3 足す)
2 3 7 9 6 4 1 2
5 16 10 3
21 13
34
緑で塗られた区間が更新される!
セグメント木の無駄なところセグメント木の無駄なところ (1)(1)
●
(s から t までの和)
= (1 から t までの和) – (1 から (s-1) までの和)
5 3 7 9 6 4 1 2
8 16 10 3
24 13
37
たとえば、「3」の情報は左と上の情報から
得られるので、おぼえる必要がない!
セグメント木の無駄なところセグメント木の無駄なところ (2)(2)
●
「左と上を見たら計算できるし、いらなくね?」
となるような箇所はこんなにある
5 3 7 9 6 4 1 2
8 16 10 3
24 13
37
この考え方を使うと、BITのデータ構造に
たどりつけるぞ!
BITBIT のしくみのしくみ (1)(1)
●
配列に、次のように対応する部分の和を持つ
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
各要素の LSB (Least Significant Bit) は?
→ 2進数で表現した時に初めて「1」が来るのは右から何番目?
BITBIT のしくみのしくみ (2)(2)
●
配列に、次のように対応する部分の和を持つ
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
→ LSB は 1
BITBIT のしくみのしくみ (3)(3)
●
配列に、次のように対応する部分の和を持つ
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
→ LSB は 2
BITBIT のしくみのしくみ (4)(4)
●
配列に、次のように対応する部分の和を持つ
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
→ LSB は 3
BITBIT のしくみのしくみ (5)(5)
●
配列に、次のように対応する部分の和を持つ
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
→ LSB は 4
区間の長さと区間の長さと LSBLSB
まとめると
●
区間の長さは、配列のインデックスを
2進表示した時のLSBと関係がある!
→ 各操作をビット演算で表現できる!
●
でも、具体的にどうやったら実現できるの?
BITBIT での和の計算での和の計算
● a1
+ a2
+ … + ai
の計算
→ 0になるまでLSBを減算しながら足していく!
5 7 6 1
8 10
24
37
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
i 2進表示 計
7 0111 1 (0 + 1)
6 0110 11 (1 + 10)
4 0100 35 (11 + 24)
0 0000 35
(3) (9) (4) (2)
(例) a1
+ a2
+ … + a7
緑で塗った場所の値を
足しあわせれば良い!
BITBIT での値の更新での値の更新
● ai
に x を足す
→ i にLSBを加算しながら更新していく!
5 7 8 1
8 12
24
39
番号
2進表示
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
i 2進表示
5 0101
6 0110
8 1000
(3) (9) (4) (2)
(例) a5
に 2 を足す
+ 0001
+ 0010
緑で塗った場所を
更新すれば良い!
BITBIT の特徴の特徴
●
要素数 N に対して サイズ N の配列 で実現可能
●
和の計算 も 値の更新 も、
ともに O(log n) の場所に対して行われるため、
計算量は O(log n) で済む!
●
実装が比較的簡単
(素敵ですね。では実装しましょう。)
BITBIT の実装の実装 (1)(1)
先ほどの話より、i の LSB を求めたい気持ちに
なる時が多々ある
●
LSBは、i & (- i) で取得できる!
※この実装は両クエリで使ううえ、他の問題で
役に立つ時もあるので覚えておきましょう
BITBIT の実装の実装 (2)(2)
●
ソースコードぺたり (注意: 1-indexed です)
BITBIT の実装の実装 (3)(3)
実際に使ってみた
(AOJ DSL_2_B: Range Sum Query)
※問題文は典型すぎるので略 (気になったら調べてね)
ちなみにちなみに
●
要素数 N は 2 のべき乗でなくても良いです
●
たとえば下の BIT は要素数 7 ですが
ちゃんと動いてくれます
番号
2進表示
1 2 3 4 5 6 7
0001 0010 0011 0100 0101 0110 0111
22次元次元 BIT (1)BIT (1)
●
2次元への拡張は比較的簡単!
(n ✕ m) の BIT は、長さ (m + 1) の BIT を
(n + 1) 個持てば良い
22次元次元 BIT (2)BIT (2)
●
ソースコードの続き
範囲の和は、2次元累積和を取る時と同じように
書けば良い!
22次元次元 BITBITの問題の問題 (1)(1)
●
Planetary Exploration (JOI 2010 本選)
縦 M (1 ≦ M ≦ 1000), 横 N (1 ≦ N ≦ 1000) の盤面内の座標
(i, j) (1-indexed) に、”J”, “O”, “I” のいずれかの 1 文字が書き
込まれている。領域の情報が、左上 (a, b), 右下 (c, d) として
k 回 (1 ≦ k ≦ 100000) 与えられるので、各領域内に
”J”, “O”, “I” がそれぞれいくつあるかを出力せよ。
4 7
1
JIOJOIJ
IOJOIJO
JOIJOOI
OOJJIJO
2 2 3 6
(Sample input)
(Sample output) 3 5 2
22次元次元 BITBITの問題の問題 (2)(2)
●
ソースコード (add するときのインデックス注意)
22次元次元 BITBITの問題の問題 (3)(3)
●
ぶっちゃけ言うとこれは 2次元 BIT を
使わなくても解ける (2次元累積和でも OK)
●
ただし、途中で「ある座標の文字を変更する」
などのクエリが来るような問題設定であれば
2次元累積和で対応できない (TLE)
●
つまり、2次元 BIT を使ったほうが
応用が効くよ! … ということで紹介しました。
●
より高次元なBITも同じように書けるそうです
(自分は書いたことない)
BITBIT の問題の問題
2次元を扱った後に1次元を扱うガバガバ進行
ですが、ここで蟻本の問題を取り上げます
●
バブルソートの交換回数
●
A Simple Problem with Integers (考察重い)
バブルソートの交換回数バブルソートの交換回数
1 〜 n の数を並び替えた数列 a0
, a1
, …, an-1
が与
えられます。この数列をバブルソートでソート
するのに必要なスワップ回数を求めなさい。
(バブルソートとは、 ai
> ai+1
であるような i を
見つけてスワップすることを繰り返すアルゴリ
ズムのことを言います)
バブルソートの交換回数バブルソートの交換回数
● i < j, ai
≦ aj
となるような (i, j) の組の個数は
BIT を用いて高速に計算できる
● i < j, ai
> aj
となるような (i, j) の組の個数も、
上の結果から求められる
●
結構考察がこんがらがるので注意?
バブルソートの交換回数バブルソートの交換回数
●
値の範囲 1 〜 n の BIT を用いて、
j = 0, 1, 2, …, n-1 の順に以下を行えば良い!
● j – (BIT の aj
までの和) を答えに加える
● BIT の場所 aj
に 1 を加算する
●
実際、どうなるの?
● → (BIT の aj
までの和) = (i < j, ai
≦ aj
なる
i の個数) になる。実際にやってみよう
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6}
0 0 0 0
0 0
0
0
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 0
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 0
 0 – (BITのa0
= 3 までの和 = 0) = 0 を 答えに加える
0 0 0 0
0 0
0
0
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 0
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 0
 BIT の場所 a0
= 3 に 1 を加える
0 1 0 0
0 0
1
1
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 0
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 1
 1 – (BITのa1
= 5 までの和 = 1) = 0 を 答えに加える
0 1 0 0
0 0
1
1
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 0
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 1
 BIT の場所 a1
= 5 に 1 を加える
0 1 1 0
0 1
1
2
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 0
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 2
 2 – (BITのa2
= 1 までの和 = 0) = 2 を 答えに加える
0 1 1 0
0 1
1
2
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 2
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 2
 BIT の場所 a2
= 1 に 1 を加える
1 1 1 0
1 1
2
3
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 2
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 3
 3 – (BITのa3
= 2 までの和 = 1) = 2 を 答えに加える
1 1 1 0
1 1
2
3
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 4
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 3
 BIT の場所 a3
= 2 に 1 を加える
1 1 1 0
2 1
3
4
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 4
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 4
 4 – (BITのa4
= 4 までの和 = 3) = 1 を 答えに加える
1 1 1 0
2 1
3
4
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 5
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 4
 BIT の場所 a4
= 4 に 1 を加える
1 1 1 0
2 1
4
5
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 5
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 5
 5 – (BITのa5
= 7 までの和 = 5) = 0 を 答えに加える
1 1 1 0
2 1
4
5
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 5
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 5
 BIT の場所 a5
= 7 に 1 を加える
1 1 1 1
2 1
4
6
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 5
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 6
 6 – (BITのa6
= 8 までの和 = 6) = 0 を 答えに加える
1 1 1 1
2 1
4
6
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 5
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 6
 BIT の場所 a6
= 8 に 1 を加える
1 1 1 1
2 1
4
7
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 5
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 7
 7 – (BITのa7
= 6 までの和 = 5) = 2 を 答えに加える
1 1 1 1
2 1
4
7
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 7
バブルソートの交換回数バブルソートの交換回数
●
例 → {3, 5, 1, 2, 4, 7, 8, 6} , j = 7
 BIT の場所 a7
= 6 に 1 を加える
1 1 1 1
2 2
4
8
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
ans = 7
バブルソートの交換回数バブルソートの交換回数
●
end

ans = 7
1 1 1 1
2 2
4
8
番号
2進表示 0001 0010 0011 0100 0101 0110 0111 1000
1 2 3 4 5 6 7 8
バブルソートの交換回数バブルソートの交換回数
●
実装は簡単です
A Simple Problem with IntegersA Simple Problem with Integers
数列 A1
, A2
, …, An
と、 Q 個のクエリが与えら
れます。クエリを順次処理してください。クエ
リは次の 2 種類です。
● l, r, x が与えられるので、Al
, Al+1
, … Ar
に
x を加える
● l, r が与えられるので、Al
, Al+1
, … Ar
の
和を求める
●
1 ≦ N, Q ≦ 100000
A Simple Problem with IntegersA Simple Problem with Integers
お、これ BIT で解けるんじゃね … ? (適当)
● l, r, x が与えられるので、Al
, Al+1
, … Ar
に
x を加える
● l, r が与えられるので、Al
, Al+1
, … Ar
の
和を求める
●
1 ≦ N, Q ≦ 100000
A Simple Problem with IntegersA Simple Problem with Integers
この部分が無理
● l, r, x が与えられるので、Al
, Al+1
, … Ar
に
x を加える
● l, r が与えられるので、Al
, Al+1
, … Ar
の
和を求める
●
1 ≦ N, Q ≦ 100000
A Simple Problem with IntegersA Simple Problem with Integers
●
区間内の全ての要素に x を加えるクエリに対応
するにはどうすればよいか?
→ BIT を 2 つ用意すれば対応できる!
●
なぜそれが言えるかを、セグメント木の場合か
ら考えていこう
A Simple Problem with IntegersA Simple Problem with Integers
●
セグメント木 (再掲)
5 3 7 9 6 4 1 2
8 16 10 3
24 13
37
各節点は、対応する区間の和を持っている
A Simple Problem with IntegersA Simple Problem with Integers
●
1 〜 5 番目に 1 を加えた時に更新が必要な節点
6 4 8 10 7 4 1 2
10 18 11 3
28 14
42
多すぎ!
A Simple Problem with IntegersA Simple Problem with Integers
各節点が、次の2つの情報を持つように改良して
みる
●
その節点の区間全体に一様に加えられた値
●
その節点の区間に一様でなく加えられた値の和
A Simple Problem with IntegersA Simple Problem with Integers
●
左: その節点の区間全体に一様に加えられた値
●
右: その節点の区間に一様でなく加えられた値の和
(5, 0) (3, 0) (7, 0) (9, 0) (6, 0) (4, 0) (1, 0) (2, 0)
(0, 8) (0, 16) (0, 10) (0, 3)
(0, 24) (0, 13)
(0, 37)
各節点は、対応する区間の和を持っている
A Simple Problem with IntegersA Simple Problem with Integers
●
1 〜 5 番目に 1 を加えた時に更新が必要な節点
(5, 0) (3, 0) (7, 0) (9, 0) (7, 0) (4, 0) (1, 0) (2, 0)
(0, 8) (0, 16) (0, 11) (0, 3)
(1, 24) (0, 14)
(0, 42)
親の節点で一様に加えられたら、子に加算しない
→更新すべき節点数が抑えられる!
A Simple Problem with IntegersA Simple Problem with Integers
(参考) 先述の機能を実装したセグメント木は
蟻本 P.164に載っています
●
では、BIT で表現するには
どのような BIT を持てば良いか?
A Simple Problem with IntegersA Simple Problem with Integers
区間 [l, r] に x を加えると、各点での和はどう
変化するかを考察しよう
● s(i) := x を加える前の a1
+ a2
+ … + ai
● s'(i) := x を加えた後の a1
+ a2
+ … + ai
A Simple Problem with IntegersA Simple Problem with Integers
3つに場合分けする
● i < l → s'(i) = s(i)
● l <= i <= r → s'(i) = s(i) + x*(i-l+1)
= s(i) + x*i - x*(l-1)
● r < i → s'(i) = s(i) + x*(r-l+1)
= s(i) + x*r - x*(l-1)
A Simple Problem with IntegersA Simple Problem with Integers
差分を考える
● i < l → s'(i) = s(i)
● l <= i <= r → s'(i) = s(i) + x*i - x*(l-1)
● r < i → s'(i) = s(i) + - x*(l-1) + x*r
A Simple Problem with IntegersA Simple Problem with Integers
差分を考える
● i < l → s'(i) = s(i)
● l <= i <= r → s'(i) = s(i) + x*i - x*(l-1)
● r < i → s'(i) = s(i) + - x*(l-1) + x*r
+ x*i - x*(l-1)
- x*i + x*r
A Simple Problem with IntegersA Simple Problem with Integers
sum(bit, i) := BITの i までの累積和 とし、
s(i) = sum(bit1, i) ✕ i + sum(bit0, i)
で表すこととすると、次のようにして更新が実現できる
● i < l → s'(i) = s(i)
● l <= i <= r → s'(i) = s(i) + x*i - x*(l-1)
● r < i → s'(i) = s(i) + - x*(l-1) + x*r
+ x*i - x*(l-1)
- x*i + x*r
① bit0 の l に -x*(l-1) を加える
② bit1 の l に x を加える
③ bit0 の r+1 に x*r を加える
④ bit1 の r+1 に -x を加える
①②
③
④
A Simple Problem with IntegersA Simple Problem with Integers
以上のことから、BIT を 2 つ持てば …
●
区間内の全ての要素に x を加算するクエリ
●
累積和を計算するクエリ
どちらも O(log n) で実現可能である!
●
実装してみましょう
A Simple Problem with IntegersA Simple Problem with Integers
●
これを導くまでの考察のほうが大変です (実装は楽)
まとめまとめ
● BIT は累積和 a1
+ a2
+ … ai
を求めるクエリと
ai
に x を足すクエリを高速に処理できる
●
セグメント木から、和の計算時の無駄を
取り除いたような形をしている
●
クエリの処理ではビット演算を使う
●
多次元への拡張が容易 (多重ループ)
●
工夫すれば他のクエリにも答えられる

More Related Content

What's hot

プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方Kensuke Otsuki
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Inc.
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~Yuma Inoue
 

What's hot (20)

動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
arc047
arc047arc047
arc047
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
Za atsu-20170328
Za atsu-20170328Za atsu-20170328
Za atsu-20170328
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 

Viewers also liked

Viewers also liked (20)

Meet inthemiddle
Meet inthemiddleMeet inthemiddle
Meet inthemiddle
 
全探索
全探索全探索
全探索
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
会津合宿2015Day3:D問題
会津合宿2015Day3:D問題会津合宿2015Day3:D問題
会津合宿2015Day3:D問題
 
ACPC2016Day3:F問題
ACPC2016Day3:F問題ACPC2016Day3:F問題
ACPC2016Day3:F問題
 
ACPC2016Day3:D問題
ACPC2016Day3:D問題ACPC2016Day3:D問題
ACPC2016Day3:D問題
 
ACPC2016Day3:C問題
ACPC2016Day3:C問題ACPC2016Day3:C問題
ACPC2016Day3:C問題
 
ACPC2016Day3:G問題
ACPC2016Day3:G問題ACPC2016Day3:G問題
ACPC2016Day3:G問題
 
ACPC2016Day3:E問題
ACPC2016Day3:E問題ACPC2016Day3:E問題
ACPC2016Day3:E問題
 
最短経路問題 & 最小全域木
最短経路問題 & 最小全域木最短経路問題 & 最小全域木
最短経路問題 & 最小全域木
 
C pub
C pubC pub
C pub
 
Topological sort
Topological sortTopological sort
Topological sort
 
G pub
G pubG pub
G pub
 
F pub
F pubF pub
F pub
 
A pub
A pubA pub
A pub
 
二分探索をはじめからていねいに
二分探索をはじめからていねいに二分探索をはじめからていねいに
二分探索をはじめからていねいに
 
動的計画法
動的計画法動的計画法
動的計画法
 
D pub
D pubD pub
D pub
 
B pub
B pubB pub
B pub
 
E pub
E pubE pub
E pub
 

Similar to Binary indexed tree

諸学者向け!進数変換の基礎知識
諸学者向け!進数変換の基礎知識諸学者向け!進数変換の基礎知識
諸学者向け!進数変換の基礎知識Toshiyuki M
 
PHP でバイナリ変換プログラミング
PHP でバイナリ変換プログラミングPHP でバイナリ変換プログラミング
PHP でバイナリ変換プログラミングYo Ya
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成眞樹 冨澤
 
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】Proktmr
 
Casual learning machine learning with_excel_no5
Casual learning machine learning with_excel_no5Casual learning machine learning with_excel_no5
Casual learning machine learning with_excel_no5KazuhiroSato8
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Tetsuya Yoshida
 
Rで実験計画法 前編
Rで実験計画法 前編Rで実験計画法 前編
Rで実験計画法 前編itoyan110
 
kagamicomput201708
kagamicomput201708kagamicomput201708
kagamicomput201708swkagami
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しようUnity Technologies Japan K.K.
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
Schönhage Strassen Algorithm
Schönhage Strassen AlgorithmSchönhage Strassen Algorithm
Schönhage Strassen Algorithmcookies 146
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版dsp_kyoto_2014
 
スパースモデリングによる多次元信号・画像復元
スパースモデリングによる多次元信号・画像復元スパースモデリングによる多次元信号・画像復元
スパースモデリングによる多次元信号・画像復元Shogo Muramatsu
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 

Similar to Binary indexed tree (20)

計算機理論入門03
計算機理論入門03計算機理論入門03
計算機理論入門03
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
諸学者向け!進数変換の基礎知識
諸学者向け!進数変換の基礎知識諸学者向け!進数変換の基礎知識
諸学者向け!進数変換の基礎知識
 
PHP でバイナリ変換プログラミング
PHP でバイナリ変換プログラミングPHP でバイナリ変換プログラミング
PHP でバイナリ変換プログラミング
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
 
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
 
Casual learning machine learning with_excel_no5
Casual learning machine learning with_excel_no5Casual learning machine learning with_excel_no5
Casual learning machine learning with_excel_no5
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 
Rで実験計画法 前編
Rで実験計画法 前編Rで実験計画法 前編
Rで実験計画法 前編
 
kagamicomput201708
kagamicomput201708kagamicomput201708
kagamicomput201708
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
Schönhage Strassen Algorithm
Schönhage Strassen AlgorithmSchönhage Strassen Algorithm
Schönhage Strassen Algorithm
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
 
ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版
 
スパースモデリングによる多次元信号・画像復元
スパースモデリングによる多次元信号・画像復元スパースモデリングによる多次元信号・画像復元
スパースモデリングによる多次元信号・画像復元
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
計算機理論入門04
計算機理論入門04計算機理論入門04
計算機理論入門04
 

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
 
ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 

Recently uploaded

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (9)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Binary indexed tree