Codeforces Little Girl and Maximum Sum(差分)

在这里插入图片描述
题目大意:
给出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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章