题目大意:
给出n项的数列A[ ], q个询问, 询问 [ l, r ] 之间项的和. 求A的全排列中该和的最大值.
解题思路:
涉及到区间修改,每次修直接循环,复杂度有可能会被卡到n^2,所以用一维差分
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+10;
ll ans;
int q,n,cnt[maxn],arr[maxn];
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i)
scanf("%d",&arr[i]);
sort(arr+1,arr+1+n);
while(q--)
{
int x,y;
scanf("%d%d",&x,&y);
cnt[x]++;
cnt[y+1]--;
}
for(int i=1;i<=n;++i)
cnt[i]+=cnt[i-1];
sort(cnt+1,cnt+1+n);
for(int i=1;i<=n;++i)
ans+=(ll)cnt[i]*arr[i];
printf("%lld",ans);
return 0;
}