2024年8月17日土曜日

Educational Codeforces Round 169 (Rated for Div. 2)

 Eまで五完。

コンテスト後のツイート


F. Make a Palindrome

 解法ツイートを参考にAC。

 コンテスト中に三乗で解く解法は思いついていた。
 配列Aにおける値は、

・配列Aの左端右端の要素が同じなら消す。違うなら、小さい方を合体させて答えを一つ増やす。これでO(配列の長さ)で求まる。

 で求められる。

 この計算量を落とす方法が分からなかったが、累積和を使って特徴づけできる。

 「両端の要素が同じなら消す」という操作をできるだけ増やしたい。a, b, c, dをindexとして、(a, b)から両端を消すことで(c, d)へもっていくことにすると、累積和Sについて、

・S[b]-S[a]=S[d]-S[c]

 が成り立つ。これを変形して、

・S[a]+S[d]=S[b]+S[c]

 なので、二つの累積和の和が同じ物を集め、index i, jについてj-iが小さい方から見ていくと、(z, w)の後に(x, y)がきた(S[x]+S[y]=S[z]+S[w]が成り立っている)なら、DP[x][y]=DP[z][w]=(z-x-1)+(y-w-1)のようにして全ての値を求めることができる。

0 件のコメント:

コメントを投稿