2020年5月11日月曜日

CodeChef May Challenge 2020 - Not a Real World Problem

部分点について。N15N \le 15なら全探索でよい。H=2H = 2なら縦2マスの符号の状態(4通り)を持ちながら左から右にDPすればよさそう。

一般の場合について。燃やす埋めるでできたら話が早いと思ってyosupoさんの記事を眺めると、できそうだ。異なる色に塗ると罰金がかかるタイプの問題であることがポイントか。

以下、yosupoさんのフレームワークに従って考える。粒子iiを正に塗る、負に塗るという言い方を使う。また、粒子iiの載っているマスに書かれている数をhih_iとする。

  • hi0h_i \ge 0の場合: iiを正に塗るとpihip_ih_i円得られる。負に塗るとpihip_ih_i円失う。→ 最初からpihip_ih_i円持っているとする。iiを負に塗ると2pihi2p_ih_i円失う。
  • hi<0h_i < 0の場合: iiを正に塗るとpihip_ih_i円失う。負に塗るとpihip_ih_i円得られる。→ 最初からpihip_ih_i円持っているとする。iiを正に塗ると2pihi2p_ih_i円失う。
  • 粒子i,ji, jが隣り合っているとき、iiを正(負)に、jjを正(負)に塗るとpipjp_ip_j円得られる。iiを正(負)に、jjを負(正)に塗るとpipjp_ip_j円失う。→ 最初からpipjp_ip_j円持っているとする。iiを正(負)に、jjを負(正)に塗ると2pipj2p_ip_j円失う。

これをそのままグラフにして、最大フローを流せばよい。


ほとんどのhy,xh_{y, x}に意味がないのはなんだったんだろう…… 誤読を疑って何度も確認してしまった。