AcWing 802. 区间和 (Python题解)

802. 区间和 - AcWing题库

思路:离散化+前缀和

图片参考自大佬的题解:AcWing 802. 画个图辅助理解~ - AcWing

附上AC代码:        ps:本人写y总二分模板时老是处理不好边界,因此用了简单好理解的方法

import sys
input=lambda:sys.stdin.readline().strip()
write=lambda x:sys.stdout.write(str(x))

#二分找离散化后映射的值
def find(x): 
    l,r=0,len(alls)-1
    res=-2
    while l<=r:
        mid=l+(r-l)//2
        if alls[mid]==x:
            res=mid
            r=mid-1
        elif alls[mid]>x: 
            r=mid-1
        else:
            l=mid+1
    return res+1
#坐标x的数量上限为1e5,两个坐标l,r的数量上限也为1e5,所以加起来为3*le5
N=300010 
add=[]
alls=[]
qq=[]
a=[0 for _ in range(N)] #前缀和数组
b=[0 for _ in range(N)] #原数组
n,m=map(int,input().split())
for _ in range(n):
    x,c=map(int,input().split())
    add.append((x,c))
    alls.append(x)
for _ in range(m):
    l,r=map(int,input().split())
    alls.append(l)
    alls.append(r)
    qq.append((l,r))
    
#排序、去重
alls=list(set(sorted(alls)))

#离散化后处理插入操作
for i in range(len(add)):
    b[find(add[i][0])]+=add[i][1]
    
#预处理前缀和
for i in range(1,len(alls)+1):
    a[i]=a[i-1]+b[i]

#处理查询:
for i in range(len(qq)):
    #注意区间也要find!!!!!
    l,r=find(qq[i][0]),find(qq[i][1])
    write(f"{a[r]-a[l-1]}\n")
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值