2020年8月17日月曜日

CodeChef August Challenge 2020 - Insanely Hard School Exam

1つの色についてだけ考える。平行な2直線がないとすると、直線がxx本ある時のtruly-geometric triangle(以下TGT)の総数は(x3)\binom{x}{3}である。これを元に、dp[x][y]=\operatorname{dp}[x][y] =xxまで見て消しゴムの残量がyyである場合のTGTの総数、として全体でO(NK){O}(NK)のDPが可能なのでsubtask2, 3が解ける。

平行線がある場合について考える。平行関係は同値関係なので、異なる同値類の総数をppとし、ii番目の同値類に属する直線がLiL_i個あるとする。L1L2...LpL_1 \ge L_2 \ge ... \ge L_pと仮定してよい。これらの直線を消していくとき、同値類の総数をできるだけ減らすように消すのが最善なので、後ろから消していくのがよい。そこでf(c,z)=f(c, z) =ccの直線がzz本残っている場合のTGTの総数、としてffを事前に求めておけば、上と同じDPで解ける。順序が固定されているのでff自体もDPで求まる。