问题描述
给定一个数组A和一些查询 L,R求数组中第L至第 R个元素之和。
小蓝觉得这个问题很无聊,于是他想重新排列一下数组使得最终每个查 询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可 以增加多少?
输入格式
输入第一行包含一个整数n。
第二行包含n个整数A1,2,··,An,相邻两个整数之间用一个空格分隔。
第三行包含一个整数m表示查询的数目。
接下来m行每行包含两个整数 L、R相邻两个整数之间用一个空格分 隔。
输出格式
输出一行包含一个整数表示答案
样例输入
5
1 2 3 4 5
2
1 3
2 5
输出
4
import os
import sys
# 请在此输入您的代码
n=int(input())
N=100003
a=[0]*N
d=[0]*N #差分数组
cnt=[0]*N #差分数组的累计和
a[1:n+1]=map(int,input().split())
m=int(input())
ans1=0
ans2=0
for i in range(m):
L,R=map(int,input().split())
d[L]+=1
d[R+1]-=1
cnt[0]=d[0]
for i in range(1,n+1):
cnt[i]=cnt[i-1]+d[i] #计算累计和,每个元素被查询的次数
for i in range(1,n+1):
ans1+=a[i]*cnt[i] #计算需要查询的元素之和,每个元素被查询的次数*元素数值
a[1:n+1]=sorted(a[1:n+1]) #排序后用较大的权重*较大的元素
cnt[1:n+1]=sorted(cnt[1:n+1])
for i in range(1,n+1):
ans2+=a[i]*cnt[i]
print(ans2-ans1)
差分数组详细解释文章:什么是差分数组?-CSDN博客