2019年5月5日日曜日

CPSCO2019 Session1 E - Exclusive OR Query

CPSCO2019 Session1 E - Exclusive OR Query

平衡二分木を使って数列を昇順に管理する。C++のsetやJavaのTreeSetと同等なものがあればよいはず。それぞれの数は奇数個あれば1個あるとの同等だし、偶数個あれば存在しないのと同じなので、多重集合である必要はない。各クエリ(Li,Ri,Xi)(L_i, R_i, X_i)に対しては次の処理を行う:

  1. LiL_i以上RiR_i以下の区間に対して愚直にxorを計算する;
  2. LiL_i以上RiR_i以下の区間を削除する;
  3. 偶奇を考慮して、必要ならXiX_iを挿入する。

1で間に合うというのが思いつかなくて、遅延更新でなんとかしようと粘ってしまった。1 言われてみればならしでO(N+QlogN){\mathcal O}(N+Q\log N)しか掛かっていない。平衡二分木の構築を合わせると、全体の計算量はO((N+Q)logN){\mathcal O}((N+Q)\log N)になる。


  1. でも、それでもできるはず。データの持ち方がおかしかった。 ↩︎