思路:离散化+前缀和
图片参考自大佬的题解: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")