Educational Codeforces Round 54 E. Vasya and a Tree

22f005935fb909e1a56a8e19d6df1e93?s=47 betrue12
November 13, 2018

Educational Codeforces Round 54 E. Vasya and a Tree

ブログ解説用

22f005935fb909e1a56a8e19d6df1e93?s=128

betrue12

November 13, 2018
Tweet

Transcript

  1. 1 2 3 4 5 6 図のようなグラフにおいて、クエリとして v = 3,

    d = 1, x = 5 の1つだけを考える。 これは図の橙色の範囲になる。
  2. 1 2 3 4 5 6 sum = 0 ans[1]

    = 0 頂点1からDFSする。 sumは各頂点の値を差分更新するための値。 imos配列はimos法のように 「範囲から(下側に)出る」という処理を するための配列。 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 0 0 0
  3. 1 2 3 4 5 6 sum = 5 (+5)

    ans[3] = 5 頂点3を訪れる。 上からの遷移でクエリの頂点 vに入った時、 imos配列に以下のような加算を行う。 (普通のimos法と同じような加算) ・vの深さに、そのクエリの加算値 xを足す。 ・「範囲から出る」深さの imos配列に  -xを加算する。 その後、imos配列の値をsumに足す。 0 0 → 5 0 0 → -5 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5
  4. 1 2 3 4 5 6 sum = 5 ans[5]

    = 5 頂点5を訪れる。 0 5 0 -5 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5
  5. 1 2 3 4 5 6 sum = 0 (-5)

    ans[6] = 0 頂点6を訪れる。 範囲から出るので、sumから値を 引かなければならない。 このとき、imos配列の値を加算することで 「範囲から出る」処理を実現できる。 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 5 0 -5
  6. 1 2 3 4 5 6 sum = 5 (+5)

    頂点5に戻る。 上に戻る際は、imos配列の値を引く。 (再びクエリの範囲内に入る) 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 5 0 -5
  7. 1 2 3 4 5 6 sum = 5 頂点3に戻る。

    深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 5 0 -5
  8. 1 2 3 4 5 6 sum = 5 ans[4]

    = 5 頂点4を訪れる。 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 5 0 -5
  9. 1 2 3 4 5 6 sum = 5 頂点3に戻る。

    深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 5 0 -5
  10. 1 2 3 4 5 6 sum = 0 (-5)

    頂点1に戻る。 このとき、入るときとは逆に まずsumからimos配列の値を引く。 その後、もうこのクエリの範囲には入らないので imos配列に足していた値を消す。 ※この後、頂点2を訪れる、頂点1に戻る、と続く  (省略) 深さに対応した imos配列 クエリ v = 3, d = 1, x = 5 0 5 → 0 0 -5 → 0
  11. 1 2 3 4 5 6 深さに対応した imos配列 ※imos配列を使うと何が嬉しい? 1つのクエリだけだと実感できないが、

    実際の問題はこんな感じで クエリが重なって入り組んでいる 「たくさんの区間をまとめて処理できる」 通常のimos法と同じように、 imos配列を使うとこれらのクエリを 同時並行的にまとめて処理できる 0 0 0 0