2022年1月9日日曜日

AtCoder Beginner Contest 234

 Gを除く七完。Hは嘘かと思いつつ投げたが、実際は正しい解法だったよう。

コンテスト後のツイート

G - Divide a Sequence

 解説AC。
 二乗のDPにはでき、式を書いてみると、maxとminは分割できることには気付けた。あとはなんらかの方法で高速化するのだろう、とは思ったが、stackを使った高速化は思いつかなかった。

 もらうDPで書いたとき、DP[i]の更新で必要なのは、各jについて、j~iについての最大値とDP[j]の値。
 この「j~iについての最大値」という配列は、jについて単調減少になっているため、そこに一つ要素xを付け加えたとき、変更されるのは後ろいくつかがxになる、というだけである。

 なので、[最大値, 最大値*DP[i]]というのをstackに突っ込んで置き、そこに新たに加わる要素xがstackの最後の要素より小さければただ付け加える。大きければ、最大値がxより小さいものたちについてmergeし、差分計算をしていけば良い。

 stackによる高速化は定石の一つなので、思いつかなかったのは反省。

 

0 件のコメント:

コメントを投稿