b_lc_所有排列中的最大和(贪心+差分优化)

第 i 个查询求 nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi] 的结果 
你可以任意排列 nums 中的数字,请你返回所有查询结果之和的最大值。
由于答案可能会很大,请你将它对 109 + 7 取余 后返回

思路
贪心明显:出现次数越多的位置分配越大的数字,然后用差分+前缀和快速统计每次操作的结果:
如果我只对s中区间[l,r]的数字加上1可以这样做(哦):s[l]++, s[r+1]--,这样最后求前缀和的时候,s[r+1...n]位置的数就不会被加上1,这样我们就可以将每次操作结果用\(O(n)\)时间统计到数组s中;如果这个改为1e5次,也同理;

const int mod=1e9+7;
class Solution {
public:
    int maxSumRangeQuery(vector<int>& A, vector<vector<int>>& rs) {
        int n=A.size(), s[n+1]; memset(s,0,sizeof s);
        for (auto& r : rs) s[r[0]]++, s[r[1]+1]--;
        for (int i=1; i<n; i++) s[i]+=s[i-1];

        sort(A.begin(), A.end());
        sort(s, s+n);
        int ans=0;
        for (int i=0; i<n; i++) {
            ans=(ans+s[i]*A[i])%mod;
        }
        return ans;
    }
};
posted @ 2020-09-20 21:12  童年の波鞋  阅读(113)  评论(0编辑  收藏  举报