题目:
假定有一个无限长的数轴,数轴上每个坐标上的数都是 00。
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]之间的所有数的和。
输入格式
第一行包含两个整数 n 和 。
接下来 n 行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l 和 r。
输出格式
共 m 行,每行输出一个询问中所求的区间内数字和。
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5
题目分析:
#把原区间序号离散化 IndexLst[i]的值代表原区间的序号,i代表离散化后的序号
#1.把添加,查询操作使用的所有序号记录下来,排序去重得到一个离散化后的区间
#2.按照离散化后的序号,进行 添加,求区间和的操作
n,m = map(int,input().split())
addNum = []
query = []
IndexLst = []
for i in range(n):
x,c = map(int,input().split())
addNum.append([x,c])
IndexLst.append(x)
for i in range(m):
l,r = map(int,input().split())
query.append([l,r])
IndexLst.append(l)
IndexLst.append(r)
#离散化操作
IndexLst.sort()
IndexLst = list(set(IndexLst))
这里重点注意alls[]排序去重后数据的离散化(find二分查找实现):
!!!二分查找的代码模板不要忘啦
def find(x):
l = 0
r = len(IndexLst)-1
while l<r:
mid = (l+r)>>1
if x<=IndexLst[mid]:r=mid
else:l=mid+1
return r+1 #离散化后的序号为1 —— len(IndexLst)-1
!!!前项和的代码模板不要忘啦
#注意nums序号从1到len-1
#s[0]=0 s[1] = nums[1]
nums=[0]*(len(IndexLst)+5)
s =[0]*(len(IndexLst)+5)
for x,c in addNum:
nums[find(x)]+=c
for i in range(1,len(IndexLst)+1):
s[i]=s[i-1]+nums[i]
for i in query:
l,r = find(i[0]),find(i[1])
print(s[r]-s[l-1])