コンテストページ: UL Systems Programming Contest 2023(AtCoder Beginner Contest 286) - AtCoder
コンテスト中AC: A〜E
D - Money in Hand
公式解説とは異なる方法でとする方法を書いておきます。
Sliding Window Agrregationを使います。
DP遷移の一例を示します。
の時、
番目の
のDP値を集めて配列とします。
同様に番目の
のDPテーブルの更新を考えると
このように、が等しいものだけを集めると、最初の方を除いては値を求めるための区間は、長さが一定のまま1つずつ右にずれていくだけということがわかります。
そのため、スライド最小値を一般化したSliding Window Agrregationが使えます。
半群やモノイドが乗せられるはずだったと思いますが、実装はモノイドにしました。モノイドの型はbooleanを、二項演算は論理演算のORを、単位元はfalseにしておけば良いです。
コンテスト中の実装: Submission #38204795 - UL Systems Programming Contest 2023(AtCoder Beginner Contest 286)
Sliding Window Agrregationの実装: Submission #38292225 - UL Systems Programming Contest 2023(AtCoder Beginner Contest 286)
E - Souvenir
が小さいので全点対間最短経路をワーシャル・フロイド法によって求めることが可能です。
お土産の価値も最短経路の求め方と似たような感じで求めることができます。
二次元配列を、
間のお土産の価値
とおきます。
初期値として、
- 頂点
間に有向辺があるなら、
- 頂点
間に有向辺が無いなら、
このようにして求めていくと、ワーシャル・フロイド法の最短距離のテーブルの更新の際、
なら、
なら、
と更新すれば良いです。
なお、このままだと始点の価値が足されていないので、の始点の価値を足して、
が求める価値です。
実装: Submission #38211470 - UL Systems Programming Contest 2023(AtCoder Beginner Contest 286)