【发布时间】:2020-08-17 18:09:23
【问题描述】:
我正在尝试解决这个问题: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,因此我目前的方法无法有效地解决问题,尽管我认为我对索引压缩有正确的想法。有人可以用我的方法指出正确的方向吗?
【问题讨论】:
标签: algorithm data-structures segment-tree range-query