クマーの競プロ精進日記

AtCoder赤とICPC World Final目指して頑張ります.競プロ自戦記、アルゴリズムなどについて

ICPC 2019 Asia Yokohama Regional-C Wall Painting (AOJ 1402, 800)

この記事は 帰ってきた AOJ-ICPC Advent Calendar 2022 の6日目の記事です.

問題リンク

onlinejudge.u-aizu.ac.jp

概要(0-indexedに変換後)

横に並んだ  N 個のマス目があり, 0, \ldots, N-1 の番号がそれぞれついている. i\ (0 \le i \lt m) 番目のロボットを作動させるとマス目 l_i, l_i + 1, \ldots, r_i-1 を色  c_i で塗る. ロボットの動作後のそれぞれのマス目の得点は,そのマス目に塗られた色が0種類であれば0点,1種類であれば  x 点,2種類以上であれば  -y 点となる.作動させるロボットを自由に選んで良いとき,得点の合計の最大値を求めよ.

制約

問題リンク先を参照.

解法

色の種類が少ないことは使いそう.

基本的に SWAG みたいな色の塗り方をするとして問題ない. l_i の昇順に処理する  O(m) の遷移はまあ明らかで,これをRMQセグ木で高速化する.塗りの重なる部分は,1マスにつき同色ならば  x ,違う色ならば  2x+y だけ損をするので,セグ木の更新時にはこれをあらかじめ引いた値を突っ込むことで適切に大小比較できる.

自分のACコード

https://onlinejudge.u-aizu.ac.jp/status/users/Kite_kuma/submissions/1/1402/judge/7144496/C++17

公式解説 (pdf)

https://icpc.iisf.or.jp/past-icpc/regional2019/commentaries-2019.pdf

 r_i の値の昇順に処理するこちらの方が方針としては考えやすそうだ.

感想

 l_i の昇順でやろうとしたせいで微妙に考えづらくなって変なバグを埋め込んでしまった.普通に考えていけば解ける問題なので,こういう問題の実装と解法ちゃんと詰める練習をしないとなあ.