人間だけど競プロやる

解けなかった問題を理解できたら記事を投稿します。日本語の解説が見つからなかったもの中心。

AtCoder Beginner Contest 178

AtCoder Beginner Contest 178

D問題 Redistribution

気づき

  • 制約が小さい(<2000
  • 長さが1のときは1通り

modを取りながらの除算(逆元)とコンビネーションは持っている前提とする。
公式解説はDPなので、ここでは単純に高校数学範囲のでやる。


項の和がSとなる数列Aの長さをLとする。
まずは数列Aの長さがどこまで大きくなれるか考えると、すべての項が3以上なので、配列の長さは最大で\lfloor \frac{S}{3} \rfloorとなる。

次に、Aの長さを増やしていったとき何が起こるか考察する。
L=1のとき、A=[S]の1通り。
L=2のとき、それぞれの項が3以上は確定しているので、残りのS - L \times 3をどう分配するかという問題になる。
これは「区別の出来ないボールがS - L \times 3個、区別のできる箱がL個あるとき、全てのボールを箱に入れる方法は何通りあるか?」という問題と考えることができる。
重複組合せと呼ばれるもので、仮に重複組合せという言葉を忘れていても、「ボールと仕切りの並び替え」を考えれば、組み合わせの応用で解くことができる。
以上より、L=1,2,3,4...と見ていき、それぞれについて重複組合せを求めて足し合わせれば良い。
よって0 < i \le \lfloor \frac{S}{3} \rfloorについて、{{}_{S - L \times 3} H_i } を足し合わせることで解ける(i=1のときも重複組合せは1になるのでOK)(0通りの場合に注意)。

E問題 Dist Max

公式解説や検索して出てくる日本語解説はマンハッタン距離の45°回転やチェビシェフ距離など難しい。
嘘解法かもしれないけど、ACした方法を書いておく(追記:解説放送で似たような式変形の解説をしていた)。

気づき

  • 絶対値をみたらmaxで分解してみる

公式解説もそうだが、絶対値をみたらmaxで分解してみるのは典型なのでやってみる。

\displaystyle{|x_i-x_j| + |y_i-y_j|}
\displaystyle{= max(x_i-x_j,-(x_i-x_j))+max(y_i-y_j,-(y_i-y_j))}
\displaystyle{= max(x_i-x_j,-x_i+x_j)+max(y_i-y_j,-y_i+y_j)}
ここで、この式をmax(A,B)+max(C,D)とみると、

  • A+B
  • A+C
  • B+C
  • B+D

の四通りがあるから、

\displaystyle{= max(x_i-x_j+y_i-y_i,x_i-x_j-y_i+y_j,-x_i+x_j+y_i-y_j,-x_i+x_j-y_i+y_j)}

i,jでまとめて、
\displaystyle{= max( (x_i+y_i)+(-x_j-y_i),(x_i-y_i)+(-x_j+y_j),(-x_i+y_i)+(x_j-y_j),(-x_i-y_i)+(x_j+y_j) )}

配列a,b,c,dを用意して、
任意のiについてa,b,c,dそれぞれに、(xi+yi),(-x_j-y_i),(-x_i+y_i),(x_i-y_i)をpushしてソートする。
上の4通りのうち 一番大きいモノ+一番大きいモノ が最大になるのは明らかなので、
\displaystyle{max(max(a)+max(b),max(d)+max(c),max(c)+max(d),max(b)+max(a))}

が答え。