この記事は 帰ってきた AOJ-ICPC Advent Calendar 2022 の6日目の記事です.
問題リンク
概要(0-indexedに変換後)
横に並んだ 個のマス目があり, の番号がそれぞれついている. 番目のロボットを作動させるとマス目 を色 で塗る. ロボットの動作後のそれぞれのマス目の得点は,そのマス目に塗られた色が0種類であれば0点,1種類であれば 点,2種類以上であれば 点となる.作動させるロボットを自由に選んで良いとき,得点の合計の最大値を求めよ.
制約
問題リンク先を参照.
解法
色の種類が少ないことは使いそう.
基本的に SWAG みたいな色の塗り方をするとして問題ない. の昇順に処理する の遷移はまあ明らかで,これをRMQセグ木で高速化する.塗りの重なる部分は,1マスにつき同色ならば ,違う色ならば だけ損をするので,セグ木の更新時にはこれをあらかじめ引いた値を突っ込むことで適切に大小比較できる.
自分の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
の値の昇順に処理するこちらの方が方針としては考えやすそうだ.
感想
の昇順でやろうとしたせいで微妙に考えづらくなって変なバグを埋め込んでしまった.普通に考えていけば解ける問題なので,こういう問題の実装と解法ちゃんと詰める練習をしないとなあ.