差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:contest_history:atcoder:2018:0825_arc101 [2020/03/16] – [解法] ikatakosprogramming_algorithm:contest_history:atcoder:2018:0825_arc101 [2020/03/17] – [解法] ikatakos
行 278: 行 278:
  
 前処理として、各ロボットの「左までの距離の集合」「右までの距離の集合」の2つについて独立に座標圧縮をしておく。 前処理として、各ロボットの「左までの距離の集合」「右までの距離の集合」の2つについて独立に座標圧縮をしておく。
 +(実際には、座標圧縮は「右までの距離の集合」のみでよいが、説明上、左も行っているものとする)
  
 例えば左右の出口までの距離の集合が以下のようだったとして、 例えば左右の出口までの距離の集合が以下のようだったとして、
行 314: 行 315:
 これを踏まえて、以下のDPを考える。 これを踏まえて、以下のDPを考える。
  
-  * DP[i][j]= 左出口までの距離が i であるロボットまで見て、最後左に1つ進めるまでの右に進んだ最大距離が j だっ時の、出口の組の個+  * $DP[i][j] = (i-1,j)$ まで移動したとき、下を先に通過したロボットと左通過しロボットの組み合わせ
   * DP[0][0]=1   * DP[0][0]=1
 +
 +これは何を示すかというと、
 +「左までの距離が i のロボットに関して、右までの距離が j 以下のロボットを右、j より大きいロボットを左から出す」場合の組合せ数を示している。
 +i1 以前のロボットについては通った経路によって左も右もあり得るが、それらを踏まえた出口の組の個数を数え上げる。
  
 ただし j については、必要無いのに無駄に右に進むことはせず、 ただし j については、必要無いのに無駄に右に進むことはせず、
行 335: 行 340:
  
 i=2 のロボットのうち、(2,4) について右から出そうと思えば、 i=2 のロボットのうち、(2,4) について右から出そうと思えば、
-「(1,0)から4つ上がる」「(1,3)から1つ上がる」の経路がある。+「(1,0)から4つ上がる」「(1,3)から1つ上がる」の経路がある。これは、(1,3)を左右どちらに落としたかに相当する。
  
   右 4|     【2】o   右 4|     【2】o
行 467: 行 472:
 そのため、Pythonなら逐一割るより、MODを全く無視して計算して、最後に1回だけ割った方が高速となった。 そのため、Pythonなら逐一割るより、MODを全く無視して計算して、最後に1回だけ割った方が高速となった。
  
-割り算遅いっすね。いや、どちらかというと多倍長が(表面上は何の工夫もせずに書ける割に高速なのか。+割り算遅いっすね。いや、どちらかというと多倍長が(表面上は何の工夫もせずに書ける割に高速なのか。
  
programming_algorithm/contest_history/atcoder/2018/0825_arc101.txt · 最終更新: by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0