第 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;
}
};