人間だけど競プロやる

解けなかった問題を理解できたら記事を投稿します。日本語の解説が見つからなかったもの中心。

Codeforces Round #851 (Div. 2) D. Moving Dots


主客転倒がすんなり発想できたけど、実装バグって間に合わなかった。
残念だったので簡単に書いておく。


2点だけを決めると真ん中に一つの不動点ができる。
いわゆる主客転倒で、この不動点が現れる組み合わせを数える。
任意の2点a ,b (a < b)を決めた時、

  • a ,bの間には他に選ばれる点はない。(間の点を選ぶと、別の不動点ができるか、同じ位置に別の2点によって不動点がつくられる)
  • a ,bの距離をdとするとき、aから左にdより大離れた点は選んでも選ばなくても影響しない。(等しい場合aが左に動いてしまう)
  • a ,bの距離をdとするとき、bから右にd以上離れた点は選んでも選ばなくても影響しない。(等しいときはbは左に動くので影響しない)

よって選んでも選ばなくても良い左側の点の数をL、右をRとして、
任意のa,bにたいして、
\sum {2^{L} \times 2^{R}} が答え。


本番ではL,Rを2分探索で求めようとしてバグってしまった。
L,Rを両端キューで管理して、尺取のような要領で管理したほうが楽だった。(aを決めた時、bを動かしていくとdは単調増加)