D - Prime Sum Game Editorial
by
Mitsubachi
Bonus の解説
Bonus の解説を書きます。( おそらく合っていると思いますが、間違っていたらすいません。 ) 入力における $B+D$ の最大値より大きい最小の素数を $N$ とし、テストケースの数を $T$ とします。
まず $f(i)$ を以下のように定めます。
- $i$ が素数のとき : $- \infty$
- $i$ が素数でないとき : $i$ より大きい最小の素数を $p$ として、 $f(i)=p-i$
この処理を前準備として行います。
さて、入力 $A,B,C,D$ について $A,B$ に $C$ を足し、 $C,D$ から $C$ を引いた としても答えは変わりません。以下この変形を行ったものとして考えます。
高橋君が整数 $i$ を選んで勝てるとき、その $i$ について$f(i) > D$ が成立します。よって、 $A \leq i \leq B$ の中で$f(i) > D$ となるような $i$ があるか判定すればよく、 $\max \left( f(A),f(A+1), \cdots , f(B) \right) > D$ であるかに帰着できます。
よって、 \(f(i)\) を \(O(N \log N)\) でSparse Tableに乗せることで各テストケースを \(O(1)\) で処理できます。
以上より \(O(N \log N +T)\) でこの問題を解くことができました。 \(B+D \leq 2 \times 10^5\) より \(N \leq 2 \times 10^5 +3\) なので十分高速だと思います。 \(f(i)\) をsegment treeに乗せて各テストケースを \(O( \log N)\) で処理した場合の \(O(N \log \log N + T \log N)\) でも余裕だと思います。
posted:
last update:
