Tenka1 Programmer Contest 2019 D問題:Three Colors

問題. Three Colors

 N 個の整数  s_1, \ldots, s_N が与えられる.与えられたすべての整数を赤,緑,青の3色のいずれかで塗るとき,次の条件を満たすような塗り方が何通りあるかを答えよ.

  • 赤,緑,青で塗られた整数の和をそれぞれ R, G, B としたとき,3辺の長さを R, G, B とした三角形が存在する

制約 3 \le N \le 300,  1 \le s_i \le 300

解法.包除原理 + 動的計画法

自力で解けなかったので Editorial を参考に解いた.

3色で塗り分けたときの各色の整数の総和を  a, b, c とする.このとき,3辺の長さが  a, b, c となる三角形が存在するための必要十分条件は,
  a + b > c かつ  b + c > a かつ  c + a > b
である(三角形の成立条件とその証明 | 高校数学の美しい物語).この条件と同値な条件として,
  \frac{S}{2}> c かつ  \frac{S}{2} > a かつ  \frac{S}{2} > b
がある.ただし, S = \sum_{i = 1}^N s_i とする(各不等式にそれぞれ  c, a, b を足すと成り立つ).ここで,

  •  U := すべての塗り分け方
  •  R := 赤色で塗られた整数の総和が  S / 2 以上となる塗り分け方
  •  G := 緑色で塗られた整数の総和が  S / 2 以上となる塗り分け方
  •  B := 青色で塗られた整数の総和が  S / 2 以上となる塗り分け方

とおくと,答えは包除原理より,
   |U| - |R| - |G| - |B| + |R \cap G| + |R \cap B| + |G \cap B| - |R \cap G \cap B|
となる. R, G, B \frac{S}{2} > a の補集合として定義したのは共通部分の計算がしやすいからである.
定義から, |R| = |G| = |B| かつ  |R \cap G| = |R \cap B| = |G \cap B| となるので,
   |U| - 3 |R| + 2 |R \cap G| - |R \cap G \cap B|
を求める. |U| は各整数を赤,緑または青への塗り方の総数なので  3^N 通りであり, |R \cap G \cap B| はそのような塗り方が存在しないので 0 通りである. |R| |R \cap G| はそれぞれ異なる動的計画法で求めることができる.

計算時間 O(N^2 \max(s_i))

最初の三角形が存在するための条件の言い換えが上手く出来ずに計算量を改善できなかった.
何番目までの要素を考慮しているかと,R と G の総和を状態として持つ方法は  R + G \le S なので上手く枝刈りできれば通るのではとやっていたのがダメだったぽい.