Official

L - 平均クエリ/Average queries Editorial by nok0


\(f(l,r)\) の性質を観察しましょう。

\(S\) に含まれる要素を昇順に \(S_1,\ldots,S_k\) とすると、実は以下の性質が成り立ちます。

  • クエリ \(2\) で答える \(f(l,r)\) の最大値は、\(f(S_1,S_2),f(S_2,S_3),\ldots,f(S_{k-1},S_k)\) のいずれかの値と一致する。

(証明): \(f(S_i, S_j)\ (j-i > 1)\)\(f(S_i,S_{i+1})\)\(f(S_{i+1},S_j)\) に対して、\(f(S_i,S_j) \leq f(S_i,S_{i+1})\) または \(f(S_i,S_j) \leq f(S_{i+1},S_j)\) の少なくとも一方が成り立つ。これは \(f\) の定義式より従う。

この関係式を繰り返し用いることで、上述の性質が示される。(証明終わり)

上述の性質を用いると、\(S\) に含まれる隣接する要素についてのみ \(f\) を管理すればよいことが分かります。これは、std::multiset などのデータ構造を用いることで可能です。

類題は ABC308-G Minimum Xor Pair Query 等です。そちらの実装も参考にしてください。

posted:
last update: