JOI logo
第22回日本情報オリンピック 二次予選

2022年12月13日
情報オリンピック日本委員会

問題
  年齢の差 (Age Difference) (配点 100点)
  時間制限 : 2 sec / メモリ制限 : 1024 MB

解説

解説担当:山縣龍人

この問題は,各 i = 1, 2, …, N に対し,|A1 - Ai|, |A2 - Ai|, …, |AN - Ai| のうちの最大値を出力する問題である.

小課題 1

小課題 1 では N = 2 であった.したがって,|A1 - A2| を 2 回出力すれば良い.

小課題 2

i = 1, 2, …, N に対し,|A1 - Ai|, |A2 - Ai|, …, |AN - Ai| の値を全て計算し,その最大値を出力することを考える.

小課題 2 では N ≦ 1000 であるから,時間計算量 O(N2) のこのアルゴリズムは十分高速である.

小課題 3

小課題 2 では N ≦ 250000 であるから,|A1 - Ai|, |A2 - Ai|, …, |AN - Ai| の値を全て計算することは時間制限に間に合わない.

数直線上の A1, A2, …, AN の位置に点を打つことを考える.すると,ある人との年齢の差の最大値は,ある点から最も遠い点までの距離と解釈することができる.

Ai から最も遠い点は,点 Ai から数直線上の正の方向に最も遠い点か,点 Ai から数直線上の負の方向に最も遠い点のどちらかである.ここで,点 Ai から数直線上の (正 or 負) の方向に最も遠い点は,それぞれ A1, A2, …, AN のうちの最大値と最小値に対応する.

したがって,mn = min { A1, A2, …, AN }mx = max { A1, A2, …, AN } とすれば,max { mx - Ai, Ai - mn } が点 Ai から最も遠い点までの距離となる.

以上をまとめると,mn = min { A1, A2, …, AN }mx = max { A1, A2, …, AN } をあらかじめ計算し,各 i = 1, 2, …, N に対して max { mx - Ai, Ai - mn } を出力すれば良い.

このアルゴリズムは O(N) 時間で動作するから,十分高速である.