Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ACPC 2019 Day3 G: Restricted DFS

105 views

Published on

2019/9/20 会津大学競技プログラミング合宿 Day3 (北大セット) G 問題
※文字が見えない場合は、ダウンロードするかフルスクリーンにしてご覧ください

Published in: Technology
  • Be the first to comment

  • Be the first to like this

ACPC 2019 Day3 G: Restricted DFS

  1. 1. 会津合宿 2019 Day3 G 問題 Restricted DFS 原案: tsutaj 問題文: tsutaj 解答: tsutaj・rsk0315 解説: tsutaj 2019 年 9 月 20 日 tsutaj ACPC 2019 Day3 G 2019/9/20 1 / 13
  2. 2. 問題 Restricted DFS ▶ 木が与えられ、それぞれの頂点 i には整数 Ai が定められている ▶ 頂点 i から DFS することを考える ▶ 頂点番号が若い順に子を見る ▶ ある頂点を訪れようとする際に Ai の値が 0 になっていれば、そこで DFS 打ち切り ▶ Ai が正ならば、その頂点を訪れ Ai をデクリメントし、次の探索に進む ▶ それぞれの頂点から DFS をはじめたときのステップ数を求める 制約 ▶ 1 ≤ N ≤ 2 × 105 ▶ 0 ≤ Ai ≤ 109 tsutaj ACPC 2019 Day3 G 2019/9/20 2 / 13
  3. 3. 想定誤解法 ▶ 普通に毎回 DFS をする ▶ 1 回の DFS に O(N) かかり、それを各頂点に関してやるので・・・ ▶ O(N2 ) かかり間に合わない ▶ なんらかの形で値を再利用しないと間に合わなさそう tsutaj ACPC 2019 Day3 G 2019/9/20 3 / 13
  4. 4. 想定解法 想定解法: 全方位木 DP ▶ 最初に適当な頂点を根とし、各頂点について以下を求める ▶ v1 : その頂点を根とする部分木でかかるステップ数 ▶ v2 : その頂点から DFS をスタートして、途中で探索が失敗するか ▶ v1 と v2 の更新に気をつけて、rerooting 次に例を示します tsutaj ACPC 2019 Day3 G 2019/9/20 4 / 13
  5. 5. 想定解法 以下のような木があったとする 赤文字は各頂点に割り当てられた Ai の値を表す 3 5 2 1 2 1 1 3 tsutaj ACPC 2019 Day3 G 2019/9/20 5 / 13
  6. 6. 想定解法 それぞれの頂点について v1 を求める (青文字) 3 5 2 1 2 1 1 3 10 5 1 1 1 1 2 3 tsutaj ACPC 2019 Day3 G 2019/9/20 6 / 13
  7. 7. 想定解法 さらに v2 も求める (黒で塗ったものが、v2 が true である頂点) ▶ 子が m 個あるような頂点は m + 1 回デクリメントされるため、 Ai < m + 1 となる頂点は true となる ▶ 自分の子であって v2 が true となる頂点があるとき、自分自身に戻っ てこれないため true となる 3 5 2 1 2 1 1 3 10 5 1 1 1 1 2 3 tsutaj ACPC 2019 Day3 G 2019/9/20 7 / 13
  8. 8. 想定解法 これで根が r であるときの答えは得られた 根を c に変えた時の答えはどう得られるか? 3 5 2 1 2 1 1 3 10 5 1 1 1 1 2 3 r c tsutaj ACPC 2019 Day3 G 2019/9/20 8 / 13
  9. 9. 想定解法 以下の順に処理! 1. c 以下の部分木を無視した状態で r について v1, v2 を再計算 2. c に r 以下の部分木が繋がったとして、c について v1, v2 を再計算 3 5 2 1 2 1 1 3 10 5 1 1 1 1 2 3 r c tsutaj ACPC 2019 Day3 G 2019/9/20 9 / 13
  10. 10. 想定解法 1. の操作はこういうイメージ 3 5 2 1 2 1 1 3 10 5 1 1 1 1 2 3 r7 tsutaj ACPC 2019 Day3 G 2019/9/20 10 / 13
  11. 11. 想定解法 2. の操作はこういうイメージ 3 5 2 1 2 1 1 3 7 5 1 1 1 1 2 3 r c11 tsutaj ACPC 2019 Day3 G 2019/9/20 11 / 13
  12. 12. 想定解法 ▶ v1, v2 の更新は区間和が扱えるデータ構造 (SegmentTree など) を使 いながらやるとできます ▶ 自分と辺で直接接続している頂点の vector を、頂点番号の昇順に持つ ▶ 自分の親である頂点を無視する必要があるが、v1 = 0, v2 = false とし て扱うと若干処理しやすいかも? ▶ それぞれの rerooting に O(log N) かかるため、全体で O(N log N) で解けます その他 ▶ 工夫次第だと思いますが、実装はだいぶ重いと思います ▶ 抽象化された全方位木 DP ライブラリは使えるのでしょうか? 今回の 問題において左・右の累積でどうにかする戦略はおそらく使えないの で、きびしいだろうと思っていました tsutaj ACPC 2019 Day3 G 2019/9/20 12 / 13
  13. 13. Writer 解・統計 ▶ Tester 解 ▶ tsutaj (C++・241 行・8013 bytes) ▶ rsk0315 (C++・376 行・10979 bytes) ▶ 統計 ▶ AC / tried: 2 / 9 (22.2 %) ▶ First AC ▶ On-site: ACPC_sakenichia (165 min 27 sec) ▶ On-line: lyrically (123 min 1 sec) tsutaj ACPC 2019 Day3 G 2019/9/20 13 / 13

×