題目大意:
給出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;
}