题意求求区内最大和
方法:把最大的数放在出现次数最多的位置
求最大和方法 数组 S[L]++ S[R+1]-- 然后递推
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define maxn 200010
using namespace std;
int b[maxn],sum[maxn],a[maxn];//差分数组,统计操作次数的数组,原数组
int main()
{
int n , q ;
scanf("%d%d",&n,&q);
for(int i = 1 ; i <= n ; i ++)
scanf("%d",&a[i]);
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
for(int i = 0 ; i < q ; i++)
{
int l ,r;
scanf("%d%d",&l,&r);
b[l]++,b[r+1]--;
}
for(int i = 1 ; i <= n ; i++)
sum[i] = sum[i-1] + b[i];//每个位置的操作次数。
sort(sum+1,sum+n+1);//排序
sort(a+1,a+n+1);//排序
long long ans = 0;
for(int i = 1 ; i <= n ; i++)
ans += (long long)sum[i]*a[i];//操作次数多的跟大数相乘。使得和最大。
printf("%I64d\n",ans);
return 0;
}
b[l]++,b[r+1]--;
for(int i = 1 ; i <= n ; i++)
sum[i] = sum[i-1] + b[i];//