利用差分的方法,求出每个数被统计了多少次
然后排序,大的与大的加,小的与小的加
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, m;
int cnt[N], w[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
scanf("%d", &w[i]);
cin >> m;
while (m -- )
{
int l, r;
scanf("%d%d", &l, &r);
cnt[l] ++, cnt[r + 1] -- ;
}
//利用差分的方法,记录每个数被统计了多少次
for (int i = 1; i <= n; i ++ )
cnt[i] += cnt[i - 1];
//先求出默认顺序的是多少
//注意开LL,不然容易越界
LL sum1 = 0;
for (int i = 1; i <= n; i ++ )
sum1 += (LL)cnt[i] * w[i];
//排序,大的与大的加,小的与小的加
sort(w + 1, w + n + 1);
sort(cnt + 1, cnt + n + 1);
LL sum2 = 0;
for (int i = 1; i <= n; i ++ )
sum2 += (LL)cnt[i] * w[i];
cout << sum2 - sum1;
}