データ構造からテストのトレーニングを行っていますが、この問題を解決できません。
シーケンスa_1、...、a_nを保持し、2つの操作を実行できるデータ構造を設計します。
- a_iを値xに設定します
- 2つのインデックスiとjの間のシーケンスで値xが発生する回数をカウントします。私が明確にしたことを確認するために(私は英語が苦手です)、それは
|{a_k: a_k = x and i <= k <= j}|
与えられたx、i、jに戻ることを意味します。制約:
- a_iは区間[0、...、10 ^ 9]からのものであり、
- nは小さい-10^5未満
両方の操作は、最大でO(log n)時間で機能するはずです。私がそれを見る唯一の方法は、残念ながら、O(log ^ 2 n)です。区間木をmaps<int,int>
ノード内に保持します。これは、サブツリーでxが発生する回数をカウントします。また、0回発生する値をマップに保持しないことも重要です(メモリの複雑さ)。
どうすればもっとうまく解決できますか?誰か助けてもらえますか?