我正在尝试解决这个问题:https ://cses.fi/problemset/task/1144/
给定一个最多包含最多元素的数组200000
,我的任务是处理最多200000
查询,这些查询要么要求我更新数组中的单个值,要么要求我查找 a 和 b 之间位于给定范围内的元素数(例如例如,查询会询问从索引1
到有多少元素5
在范围内[2, 3]
)。
我目前的想法是首先对给定数组中的值使用索引压缩(因为值可以高达10^9
,所以保留一个简单的出现数组会超过存储限制),然后保留另一个数组,其中包含每个压缩的出现次数数字。然后,可以使用求和段树来处理和更新查询。
但是,我在尝试实施这种方法时遇到了问题。我意识到更新单个数组值会迫使我更改压缩数组。
例如,给定一个数组[1, 5, 3, 3, 2]
,我将定义一个压缩函数C
,使得
C[1] = 0;
C[2] = 1;
C[3] = 2;
C[5] = 3;
然后,出现数组将是[1, 1, 2, 1]
,并且处理求和查询将是有效的。但是,如果我被指示更新一个值,例如,将第三个元素更改为4
,那么这会使一切失去平衡。压缩函数必须更改为
C[1] = 0;
C[2] = 1;
C[3] = 2;
C[4] = 3;
C[5] = 4;
这将迫使我重建我的发生数组,从而导致O(N)
更新时间。
由于N
可以达到200000
,我目前的方法无法有效地解决问题,尽管我认为我对索引压缩有正确的想法。有人可以用我的方法指出我正确的方向吗?