アルゴリズム忘備録

競技プログラミングとかデータ分析とか

Yukicoder No.1013 〇マス進む

yukicoder.me

 

ダブリングの練習。

まず「次の場所 % n」の値をダブリングテーブルを前処理しておく。

 

for (int i = 1; i < m; i ++) {

 for (int j = 0; j < n ; J++) {

   table[i][j] = table[i-1][table[i-1][j]]

  }

}

ダブリングテーブル自体はこんな感じで更新できる。

さらにp[i]進んだときに何周するかがわかれば良い。

これもダブリングと同じようにマスjから2^(i-1)だけ進んだときに何周したか、というのをテーブルで書いておく

for (int i = 1; i < m; i ++) {

 for (int j = 0; j < n ; J++) {

   table2[i][j] = table[i-1][j] + table2[i-1][table[i-1][j]]

  }

}

 位置のダブリングテーブルを使うとこんな感じでかける。最後に「周回数 * n + 位置」をそれぞれのクエリにO(log(K)) で計算する。

 

全体計算量はO(N log(K))