解析:
差分统计每个点的增加次数cnt数组,然后对于cnt和数据数组a进行排序,然后累计cnt[i]*a[i]的总和即可。
贪心,将累加次数更多的位置给最大的数。
#include
using namespace std;
#define int long long
const int N=2e5+5;
int n,a[N],c[N],cnt[N],m;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%lld%lld",&x,&y);
c[x]+=1;
c[y+1]-=1;
}
for(int i=1;i<=n;i++){
cnt[i]=cnt[i-1]+c[i];
}
sort(cnt+1,cnt+n+1);
sort(a+1,a+n+1);
int res=0;
for(int i=1;i<=n;i++){
res+=a[i]*cnt[i];
}
cout<