给出有n个元素的由小到大的序列,请你编程找出每次询问的某元素第一次出现的位置,共询问m次。(n<=2,000,000,m<=100,000,序列中的数值均小于105)
时间: 2024-03-23 15:40:58 浏览: 136
给定一个整数数组,其中元素的取值范围为0到10000,求其中出现次数最多的数
5星 · 资源好评率100%
可以使用离线询问和树状数组来解决这个问题。
首先,我们对所有询问进行离线处理,即将所有询问按照它们在原序列中出现的顺序排序。
然后,我们用树状数组来维护元素的出现位置。我们将树状数组的下标设为元素值,每个元素记录它在原序列中最后一次出现的位置。这样,当我们需要查询某个元素第一次出现的位置时,只需查找该元素在树状数组中的最小位置即可。
最后,我们按照离线排序后的顺序依次处理每个询问,查询对应元素第一次出现的位置即可。
以下是示例代码:
```python
n, m = map(int, input().split())
a = list(map(int, input().split()))
q = []
for i in range(m):
x = int(input())
q.append((x, i))
# 离线排序
q.sort()
# 初始化树状数组
bit = [0] * (max(a) + 1)
last = [-1] * (max(a) + 1)
# 处理询问
ans = [0] * m
j = 0
for x, i in q:
while j < n and j <= x:
# 更新树状数组
if last[a[j]] != -1:
bit[last[a[j]] + 1] -= 1
bit[j + 1] += 1
last[a[j]] = j
j += 1
ans[i] = sum(bit[:x + 1])
# 输出答案
for x in ans:
print(x)
```
其中,`bit`数组表示树状数组,`last`数组表示元素最后一次出现的位置,`ans`数组表示每个询问的答案。在处理询问时,我们依次将元素的出现位置加入树状数组中,并根据 `last` 数组更新树状数组中元素的位置。最后,我们按照离线排序后的顺序依次查询每个询问对应元素的第一次出现位置,并将答案存入 `ans` 数组中。
阅读全文