题目链接:https://codeforces.com/problemset/problem/276/C
思路:哪个位置选择的次数最多,就让它用最大的数。
差分+前缀和 求着每个位置的次数,然后对这数组排序。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
long long a[maxn];
long long cha[maxn];
int n,q;
void solve(){
for(int i=1;i<=n;i++){
cha[i]+=cha[i-1];
}
sort(cha+1,cha+1+n);
sort(a+1,a+1+n);
long long res=0;
for(int i=1;i<=n;i++){
res+=a[i]*cha[i];
}
printf("%lld",res);
return ;
}
void INPUT(){
scanf("%d %d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=q;i++){
int l,r;
scanf("%d %d",&l,&r);
cha[l]++;
cha[r+1]--;
}
solve();
}
int main()
{
INPUT();
//solve();
return 0;
}