Python每日一题——区间和

题目:

假定有一个无限长的数轴,数轴上每个坐标上的数都是 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])

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值