第5回ドワンゴからの挑戦状-C:k-DMC
終了46秒前に通ってアツかった。
問題
解法
dpがちらついたが,順番に並んでいる3つ組を数えるときは,中央を固定するのが定石なので,とりあえずそれに従って考えてみる。ここで,もしという条件がなければ,これは単にに現れる「DMCという部分列の数」を数えるだけである。つまり,'D','M','C'の出現数について累積和を取っておき,各'M'について「その'M'より左にある'D'の数」と「その'M'より右にある'C'の数」の積を取ればよい。
さらに,「をみたすDMCという部分列の数」がわかれば,これを「DMCという部分列の数」から引くことで答えが求まる。ここが1つのポイントだろう。
それでは,「をみたすDMCという部分列の数」を求めよう。'D'の位置を,'M'の位置を,'C'の位置をとする。DMCという部分列であって,この条件を満たすとき,の関係として考えられるものは
- かつ ('C'だけ遠い)
- ('M'も'C'も遠い)
の2つであり,これらは排反である。1の方は,区間にある'M'の数と,]にある'C'の数が求まればよいから,'M'と'C'の累積和を使えばで求まる(詳細は提出参照)。2の方は,「位置より右にあるMCという部分列の数」を事前に求めておけばで求まる(これも累積和,提出参照)。よって,各の値に対してで答えが求まるので,全体としてであり,十分高速である。
提出
Submission #3660113 - Dwango Programming Contest V / 第5回 ドワンゴからの挑戦状 予選
- コンテスト後に少し整理したものを貼った。
- がを超える場合の処理に注意。
- Bでひどいミスをしたのだがこれが解けたおかげで耐えた。
- という条件は,という形にした方が扱いやすい印象があった。C - 徒歩圏内を思い出して解いていた。
- 公式解説見たら尺取りだった。