phyllo’s algorithm note

レッドコーダーへの道のりは遠い。休んでる場合じゃない!

ABC173 E. Multiplication 4

問題

N個の整数A_iが与えられる。
この中からK個の要素を選び、それらの積が最大になるものを答えよ。
ただし、積は10^9+7で割ったあまりで答えよ。

制約

  • 1 <= K <= N <= 2*10^5
  • | A_i | <= 10^9

解法

まず、負、0、正に分類し、パターンに分けて考える。

「負」の数+「正」の数がKに足りない場合、必ず0を使わないといけなくなるため、答えは0になる。

また、K=1の場合は、「正」「0」「負」の順に一番大きい数字があるものを1つ返せば良い。

したがって、上記を除いた、

  • 「負」の数+「正」の数がK以上ある
  • K >= 2

の場合を考えれば良い。

まず、Kが奇数の場合は、「正」の数を必ず1つ以上含めないといけない。
したがって、「正」で最大のものを先に入れておくことでKを偶数の場合と同様に考えることができる。

次に、Kが偶数の場合、「負」を2個いれるか、「正」を2個いれるかを考えれば良い。
「正」が1個だけ入れる場合は、必ず後で「正」のものを1個入れないとパリティが合わないので、2個入れると考えて良い。
したがって、「負」の昇順で連続する2個と「正」の降順で連続する2個を作り、その掛け算の大きさが大きい順にK/2個になるよう選べば良い。

上記でK個選べない場合は、「0」を入れて答えを0にするが、「0」がなければ「負」と「正」の整数の絶対値が小さいものからK個かけ合わせた負の値を返せばよい。