2007年春合宿3日目第3問 Circuit(10)

気晴らしに難易度10を単体解きしようと思って考えた

頭を使わずに考察していると悪い表現になって、場合分けと境界処理が大変な解が出た

やる気が無かったので解説を探すが、どこにも無かった

頭を使って考察すると多少マシな解が出て、解説を自分で書くことにした

問題

各頂点の入次数、出次数ともに1の有向グラフを構築せよ。

ただし、頂点iのK個先の頂点がa[ i ]でなければならない。 

1<=N,K<=10^5

解法

各頂点の入次数、出次数ともに1の有向グラフは、サイクルが何個かある形だ。

サイズSのサイクルでは、それぞれの頂点はK%S個進んだ所の頂点に対応する。

そして、gcd(S,K)個ずつの周期で自由に対応させることができる成分ができる。

具体的には、S/gcd(S,K)のサイズの成分が独立にgcd(S,K)個作れる。

与えられるiとa[i]の関係から、同じ成分に属する頂点集合がわかり、サイズのみが注目するべき情報である。

サイズSの成分をすべて作ることを考える。

前に求めた情報から、成分をまとめていくつ作れるかがわかっているので、復元付きのナップザックの処理をすることで、成分の作り方がひとつ求められる。(作れないときは0を出力して即終了する。)

求めた作り方に従って適切に辺を張り、答えとする。

(↑ココの正確さと詰める速さが大事)

ナップザックの重さがサイズ一種類につきO(√N)通りなので、計算量は全体でO(N√N)

 

joisc2007.contest.atcoder.jp

 

前よりWAと混乱が減っていて、実装力が付いた感じがする