初始化为0,出现次数就相当于区间内数+1,然后贪心;


#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<int,int> PII;
ll n,m;
ll a[N];
ll df[N];
priority_queue<ll> pq;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cin>>m;
for(int i=0;i<m;i++)
{
int l,r;
cin>>l>>r;
df[l]+=1;///差分数组快速求频率
df[r+1]-=1;
}
int w=0;
ll ys=0;
for(int i=1;i<=n;i++)///ys就是原sum=i*pi(i对应的频率)
{
w+=df[i];
ys+=a[i]*w;
pq.push(w);
}
ll i=n;
ll s=0;
sort(a+1,a+1+n);
while(pq.size())///贪心,最大的情况就是最大值*最大频率
{
if(pq.top()<=0) break;
s+=a[i]*pq.top();
pq.pop();
i--;
}
cout<<s-ys;///差
return 0;
}