G - Palindrome Construction 解説 by Nyaan


データ構造を利用した別解を簡単に紹介します。
想定解にある言い換え + いくらかの考察により、\(2N\) 頂点の無向グラフに対して次の 2 種類のクエリを高速に処理するデータ構造が存在すればこの問題を解くことが出来ます。

  • merge(a, b, l) : \(i=0,1,2,\dots,l\) について, 頂点 \(a+i\) と頂点 \(b+i\) の間に辺を張る。
  • leader(a) : 頂点 \(a\) が所属する連結成分の代表元を返す。

このようなクエリは、 Range Parallel Unionfind (仮称) と呼ばれるデータ構造を利用することで、クエリ処理の部分を全体で \(\mathrm{O}(N \alpha(N))\)\(\mathrm{O}(N \log N \alpha(N))\)\(\mathrm{O}(N \log^2 N)\) で処理することが出来て、これは十分高速です。

(注 : 2 番目と 3 番目のアルゴリズムは merge クエリを処理し終えた後に same クエリが来る場合にのみ使用可能です)

投稿日時:
最終更新: