AISing Programming Contest 2019 D - Nearest Card Game
シミュレーションしてみると(時系列を無視すれば)
- 高橋君が上から何枚か取って
- 残りを青木君が上から同じ枚数取って
- さらに残りを二人で上から交互に取る
という仕組みになっていることがわかる。
高橋君が手順1で上からl枚、つまり区間[N−l,N)を取るとし、青木君が手順2で区間[N−2l,N−l)を取るとして、与えられたルールに従うためのlの条件を考える。
まず、青木君が取るもっとも大きい数はAN−l−1である。したがって、青木君が最初に決めた数をxとするとき、x−max(AN−l−1−x,0)以上の数が書かれたカードはすべて青木君が取っていなければならないことになる。ここで、
f(y):= y以上の数が書かれたもっとも左のカードのインデックス
とする。( f(y)は二分探索で求まる。) fを使って上の条件を表すと、青木君は少なくとも区間[f(x−max(AN−l−1−x,0)),N−l)を取らなければならず、これは、青木君が手順2で取るカードの枚数が(N−l)−f(x−max(AN−l−1−x,0))以上であることを意味する。この数をg(l,x)で表すとき、g(l,x)はl以下でなければならない。したがって、ルールに従った取り方では、g(l,x)≤lであるような最大のl=:lmaxが、手順1, 2で実際に取った枚数になる。g(l,x)はlについて単調増加なのでlmaxはやはり二分探索で求まる。
lmaxが求まったら、高橋君の点数は区間[N−lmax,N)の総和と[0,N−2lmax)をひとつおきに取った和(0から始まるか1から始まるかは偶奇による)の合計になるため、どちらも累積和を計算しておけばO(1)で求まる。