きろく

特筆すべき記録のまとめ

技術室奥プログラミングコンテスト#4 Day2:D - 新入生歓迎数列 2

問題

https://atcoder.jp/contests/tkppc4-2/tasks/tkppc4_2_d

解法

与えられた条件式を整理すると,

2 * A_x == P + Q

2 * (A_y + A_z) == P - Q

となる (x, y, z) の組を見つければよいと分かる.前者は自明に判定できるので,後者を見つける方法を考える.A を後ろから見ていく.A_i を A_y と見たとき,A_z となりうる数は P - Q - A_i であるから A_(i + 1) ~ A_N の中で P - Q - A_i である数の個数が分かれば (y = i, z) の組の個数は求まる.これは std::map を用いれば各数の出現回数を管理することができる.このようにして (y = i, z) の組を各 i について求め,後ろから累積和を取っておく.最後に,A_i * 2 == P + Q となる A_i が出てきたら x = i とし,i + 1 番目以降にある (y, z) の組の個数の和を答えに加算すればよい.O(NlogN).

解答

https://atcoder.jp/contests/tkppc4-2/submissions/6592595

実装で詰まらなかったのでよかった.

f:id:babcs2035:20190728192100p:plain