题意:
有一个整数数组 nums ,和一个查询数组 requests ,其中 requests[i] = [starti, endi] 。
第 i 个查询求 nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi] 的结果 ,
starti 和 endi 数组索引都是 从 0 开始 的。
你可以任意排列 nums 中的数字,请你返回所有查询结果之和的最大值。
由于答案可能会很大,请你将它对 109 + 7 取余 后返回。
1 <= arr.length <= 100
1 <= arr[i] <= 1000
解法:
对询问进行差分,计算出每个位置会被累加多少次,
最后对次数数组和nums数组排序,累加次数大的位置填大的数即可.
code:
const int mod=1e9+7;
class Solution {
public:
int maxSumRangeQuery(vector<int>& a, vector<vector<int>>& b) {
int n=a.size();
vector<int>d(n);
for(auto s:b){
int l=s[0],r=s[1];
d[l]++;
if(r+1<n)d[r+1]--;
}
for(int i=1;i<n;i++){
d[i]+=d[i-1];
}
sort(d.begin(),d.end());
sort(a.begin(),a.end());
int ans=0;
for(int i=0;i<n;i++){
ans+=1ll*a[i]*d[i]%mod;
ans%=mod;
}
return ans;
}
};