我正在训练数据结构的测试,但我无法解决这个问题:
设计一个保持序列 a_1, ..., a_n 的数据结构,并且可以对其执行两个操作:
- 将 a_i 设置为值 x
- 计算值 x 在两个索引之间的序列中出现的次数:i 和 j;只是为了确保我说清楚(我不擅长英语),这意味着返回
|{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)。我们使用 in 节点保留区间树maps<int,int>
,它计算 x 在子树中出现的次数。同样重要的是不要保留出现 0 次的映射值(内存复杂度)。
我怎样才能更好地解决它?任何人都可以帮忙吗?