MC0351・区间询问和
难度:黄金 时间限制:1 秒 占用内存:64 M 收藏 报错
有 n 个数字,为 a [1]...a [n]。
再来 q 个询问,每个询问包含两个数字 L,r,表示询问∑i=Lr{a[i]}
小码哥可以重新排列给出的 a 数组,使这 q 组询问所得结果之和最大,输出这个最大值。
格式
输入格式:第一行输入 n 和 q;
第二行输入 n 个数字,第 i 个数字为ai;
接下来 q 行,每组询问占一行,包含两个数li,ri。
输出格式:一个数,即上述答案。
样例 1
输入:
3 3
5 3 2
1 2
2 3
1 3
输出:25
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int a[N],dif[N],ori[N];
long long ans = 0;
bool compare(const int & a,const int &b)
{
return a > b;
}
int main( )
{
int n,q;
cin >> n >> q;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
while(q--)
{
int l,r;
cin >> l >> r;
dif[l] += 1;
if(r + 1 <= n)
dif[r + 1] -= 1;
}
sort(a + 1,a + 1 + n,compare);//原数组降序
for(int i = 1 ; i <= n ; i++)
{
ori[i] = ori[i-1] + dif[i];
}
sort(ori + 1,ori + 1 + n,compare);//查询数组降序
for(int i = 1 ; i <= n ; i++)
{
ans += a[i] * ori[i];
}
cout << ans;
return 0;
}