第5回ドワンゴからの挑戦状-C:k-DMC

終了46秒前に通ってアツかった。

問題

C - k-DMC

解法

dpがちらついたが,順番に並んでいる3つ組を数えるときは,中央を固定するのが定石なので,とりあえずそれに従って考えてみる。ここで,もしc-a\lt kという条件がなければ,これは単にSに現れる「DMCという部分列の数」を数えるだけである。つまり,'D','M','C'の出現数について累積和を取っておき,各'M'について「その'M'より左にある'D'の数」と「その'M'より右にある'C'の数」の積を取ればよい。
さらに,「c-a\geqq kをみたすDMCという部分列の数」がわかれば,これを「DMCという部分列の数」から引くことで答えが求まる。ここが1つのポイントだろう。

それでは,「c-a\geqq kをみたすDMCという部分列の数」を求めよう。'D'の位置をa,'M'の位置をb,'C'の位置をcとする。DMCという部分列であって,この条件を満たすとき,a,b,cの関係として考えられるものは

  1. b\lt a+k かつ  a+k \leqq c ('C'だけ遠い)
  2.  a+k \leqq b \lt c ('M'も'C'も遠い)

の2つであり,これらは排反である。1の方は,区間[a+1,a+k)にある'M'の数と,[a+k,N]にある'C'の数が求まればよいから,'M'と'C'の累積和を使えばO(1)で求まる(詳細は提出参照)。2の方は,「位置iより右にあるMCという部分列の数」を事前に求めておけばO(1)で求まる(これも累積和,提出参照)。よって,各kの値に対してO(N)で答えが求まるので,全体としてO(QN)であり,十分高速である。

提出

Submission #3660113 - Dwango Programming Contest V / 第5回 ドワンゴからの挑戦状 予選

  • コンテスト後に少し整理したものを貼った。
  • a+kNを超える場合の処理に注意。
  • Bでひどいミスをしたのだがこれが解けたおかげで耐えた。
  • c-a\lt kという条件は,c-a\geqq kという形にした方が扱いやすい印象があった。C - 徒歩圏内を思い出して解いていた。
  • 公式解説見たら尺取りだった。