Tenka1 Programmer Contest 2019: D - Three Colors
問題
$N$ 個の整数が与えられます。 $i$ 個目の整数は $a_i$ です。 与えられたすべての整数を赤、緑、青の $3$ 色のいずれかで塗り、以下の条件を満たすようにする方法の個数を $998244353$ で割ったあまりを求めてください。
- 赤、緑、青で塗られた整数の総和をそれぞれ $R, G, B$ とする。三辺の長さがそれぞれ $R, G, B$ であるような正の面積の三角形が存在する。
考察過程
思い出し:
- 総和 $(R, G, B)$ の条件は $R + G + B \gt 2 \max(R, G, B)$ に等しい。
- 補集合を数えると楽そう。
- $R + G + B = \sum a_i$ は固定なので最大値の側だけ考えればよい。
- 全体 $3^n$ から「最大の総和が $\sum a_i / 2$ を超えるものの数」を引けばよい。
- DP やるだけぽい。
- 書いた。だめ。$\sum a_i$ が偶数の場合だけ落ちる。
- 最大値 $C$ がよくても $A = 0$ だとだめ。
- $A = 0, ~ B = C = \sum a_i / 2$ のような場合がだめっぽい。
- (時間切れ)
解法
三角形を作れる条件は最大の辺が $\sum a_i / 2$ 以上であること。 $\sum a_i$ が奇数の場合は自然に DP やるだけ。 偶数の場合も同様だが、 $(\sum a_i / 2, \sum a_i / 2, 0)$ などの形を重複して数えてしまうのでこれを別の DP で求めて引いてやる必要がある。 計算量は $O(N \sum a_i)$。
反省
- 方向は見えていたのに時間切れ。深く考えずに実験や係数ガチャで脳死で通そうとしたのがだめ。
- ちゃんと考察過程を wiki にまとめていくようにすれば冷静さが得られたりしないか?
- 「これ足しすぎてるから引けばよさそう」ではなくてきちんと「包除原理」と言葉にする必要があった気がする。後から言われて「ああこれのことね」と気付いたのはよくなさそう。
- 1行修正したらAC。なぜなのか。