E - Set Add Query Editorial by rsk0315

クエリ平方分割

以下では、クエリの添字を 0-indexed とします。 すなわち、クエリを \(\langle x_0, x_1, \dots, x_{Q-1}\rangle\) とします。


クエリを \(b\) 個ごとに分割することを考えます。 分割の \(i\) ブロック目は \(\langle x_{bi}, x_{bi+1}, \dots, x_{bi+(b-1)}\rangle\) です。 \(i\) ブロック目に含まれる整数の集合を \(S_i = \{x_{bi}, x_{bi+1}, \dots, x_{bi+(b-1)}\}\) とすると、\(|S_i| \le b\) です。

\(i\) ブロック目に含まれない値 \(j\notin S_i\) に関しては、\(i\) ブロック目のクエリの処理前後の \(A_j\) の差が共通なので、それを \(d_i\) とおきます。

\(i\) ブロック目の各クエリに対して、下記を行います。

  • \(d_i\) にその時点での \(|S|\) を加算する。
  • \(j\in S\wedge S_i\) に対して、\(A_j\)\(|S|\) を加算する。

\(i\) ブロック目の各クエリを処理し終えたら、各 \(j\in \{1, 2, \dots, N\}\smallsetminus S_i\) に対して \(A_j\)\(d_i\) を加算します。


各ブロックに対して \(O((b^2+N)\cdot \frac Qb) = O(Q(b+N/b))\) 時間で処理できるため、\(b = \Theta(\sqrt N)\) とすると、全体で \(O(Q\sqrt N)\) 時間となります。

posted:
last update: