题目
给定一个数组 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
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int s[N],w[N];
int n,m;int main(){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&w[i]);scanf("%d",&m);while(m--){int l,r;scanf("%d%d",&l,&r);s[l]++,s[r+1]--;}for(int i=1;i<=n;i++) s[i] += s[i-1];long long sum1 = 0;for(int i=1;i<=n;i++)sum1 += (long long) s[i] * w[i];long long sum2 = 0;sort(s+1,s+n+1);sort(w+1,w+n+1);for(int i=1;i<=n;i++)sum2 += (long long) s[i] * w[i];printf("%lld",sum2-sum1);
}