1、排序不等式
简单来说就是大的乘以大的,小的乘以小的,按顺序就可以排除最大的和
2、差分
由于题目涉及区间范围同时加上一个数,所以利用差分数组可以将复杂度降为O(n)
3、解题思路
根据排序不等式,我们开一个cnt数组记录每个位置需要查询的次数,这个过程使用差分数组降低复杂度,然后利用sort排序求出两次结果的差
4、实现代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<int,int>PII;
const int N=1e5+10;
int n,m,ans;
int cnt[N],a[N];
int main(int argc, char** argv) {
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
while(m--){
int l,r;
cin>>l>>r;
cnt[l]++,cnt[r+1]--;//差分
}
for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1];//求前缀和得出每个位置加了多少次
ll sum1=0,sum2=0;//记录排序前和排序后的sum值
for(int i=1;i<=n;i++) sum1+=(ll)cnt[i]*a[i];//注意数据范围最大为1e11所以要强转ll
//排序后
sort(a+1,a+1+n);
sort(cnt+1,cnt+1+n);
for(int i=1;i<=n;i++)sum2+=(ll)cnt[i]*a[i];
cout<<sum2-sum1;
return 0;
}