题目描述
给定一个数组 A 和一些查询 Li , Ri,求数组中第 Li 至第 Ri 个元素之和。
小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?
输入格式
输入第一行包含一个整数 n。
第二行包含 n 个整数 A1, A2, · · · , An,相邻两个整数之间用一个空格分隔。
第三行包含一个整数 m 表示查询的数目。
接下来 m 行,每行包含两个整数 Li、Ri ,相邻两个整数之间用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
样例输入
复制
5 1 2 3 4 5 2 1 3 2 5
样例输出
复制
4
提示
原来的和为 6 + 14 = 20,重新排列为 (1, 4, 5, 2, 3) 后和为 10 + 14 = 24,增加了 4。
对于 30% 的评测用例,n, m ≤ 50 ;
对于 50% 的评测用例,n, m ≤ 500 ;
对于 70% 的评测用例,n, m ≤ 5000 ;
对于所有评测用例,1 ≤ n, m ≤ 105,1 ≤ Ai ≤ 106,1 ≤ Li ≤ Ri ≤ 106 。
n=int(input())
## 输入数组
nums=[0]+list(map(int,input().strip().split()))
## 前缀和pres
pres=[0]*(1+n)
for i in range(1,1+n):
pres[i]=pres[i-1]+nums[i]
## m查询数目
m=int(input())
## 用于统计数的出现次数
index=[0]*(2+n)
##原先和
Sum1=0
for _ in range(m):
l,r=map(int,input().strip().split())
Sum1+=pres[r]-pres[l-1]
index[l]+=1
index[r+1]-=1
for i in range(1,n+1):
index[i]+=index[i-1]
## 会超时
## nums.sort(key=lambda x:-x)
nums.sort(reverse=True)
index.sort(reverse=True)
## 现在和
Sum2=0
for i in range(n):
Sum2+=nums[i]*index[i]
print(Sum2-Sum1)
## 供参考(会超时)
## 重新排序
## 贪心思维
n=int(input())
nums=list(map(int,input().strip().split()))
## m查询数目
m=int(input())
## 查询范围
lst=[list(map(int,input().strip().split())) for _ in range(m)]
## index出现次数
index=[0]*n
for i in range(n):
for j in range(m):
if lst[j][0]-1<=i<=lst[j][1]-1:
index[i]+=1
result1=0
for i in range(0,n):
result1+=nums[i]*index[i]
index.sort()
##print(index)
nums.sort()
##print(nums)
result2=0
for i in range(0,n):
result2+=nums[i]*index[i]
print(result2-result1)