ABC157に参加した。自分用メモ。
A~Dは特に問題なく解けた。Eも解法は思いついたが、セグメント木の実装にバグがあり、RE(Runtime Error)。
D-Friend Suggestions
各人の友達候補の数を計算する問題。無向グラフのノードが人、エッジが友達関係/ブロック関係になっている。
「ある人物Aの友達候補がBである」とは、
- Aから友達関係をたどってBに到達できる
- AとBがブロック関係になっていない
- AとBが異なる人物
と定義される。したがって、
が求める答えになる。(Aが含まれる連結成分: 友達関係の辺で構成される連結成分)
連結成分の求め方
2つ方法がある。
今回はDFSを使ったが、Union-Find木を用いるほうがシンプルそう。あとで実装する。
[追記] 03/05/20
Union-Find木を用いる実装
E-Simple String Queries
ある文字列が与えられ、それに対する2種類のクエリがN個発行される。
- クエリ1: 文字列のk番目の文字を変更する
- クエリ2: 文字列のl番目からr番目からなる部分文字列を取得する
セグメント木で、各ノードが、それに対応する区間に含まれる文字の集合をもつようにすれば、高速にクエリを処理できる。今回の問題では、文字の集合を管理するのに、set<char>
を使ってもいいが、文字列は英小文字からなるという制限があるので、26bitのビットフラグで集合を管理すると、処理が早いし、コードも簡潔になる。