题意:
有若干对区间和的查询,问如何重组数组使查询结果的和最大。N为区间长度,M为查询次数。
思路:
统计出每一个位置出现的次数,统计的过程利用扫描线,然后当然出现最多的那个位置放最大的数,然后相乘累加就行
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+100;
long long a[MAXN];
long long lis[MAXN];
int main()
{
ios::sync_with_stdio(false);
long long n,m,st,en;
while(cin>>n>>m){
memset(lis,0,sizeof(lis));
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
while(m--){
cin>>st>>en;
lis[st-1]++;
lis[en]--;
}
for(int i=1;i<n;i++)
lis[i]+=lis[i-1];
sort(lis,lis+n);
long long ans=0;
for(int i=0;i<n;