きろく

特筆すべき記録のまとめ

九州大学プログラミングコンテスト2018:E - Treeone

問題

beta.atcoder.jp

解法

ある要素を inf にした場合,答えは2つに分けられた数列のそれぞれの中で完結する要素の総和が0である部分列の数の和になる.そこで,2つに分ける箇所を全探索し,それぞれについて前後の数列に当てはまる部分列がいくつあるか調べる.この時,元の数列の最初と最後から同じ要素が出てきた個数を数えて置き,それぞれ累積和を取ることによって,当てはまる部分列の個数を O(1) で知ることが出来る.累積和を取る際,元の数列の最初からのものだけを計算し,部分列の個数を求めようとするのは間違え(要素を0にする箇所をまたぐ部分列の個数も含んでしまうことになるから).

解答

beta.atcoder.jp

最初,要素を0にする箇所をまたぐ部分列の個数を全部の個数から引くことを考えていて実装が詰まってしまった.解説を読んで解法の通りに方針転換したが,実装がまた難しすぎて時間が大幅にかかった.

f:id:babcs2035:20181101231832p:plain