重新排序(排序不等式+差分)蓝桥

重新排序

1、排序不等式

在这里插入图片描述

简单来说就是大的乘以大的,小的乘以小的,按顺序就可以排除最大的和

2、差分

由于题目涉及区间范围同时加上一个数,所以利用差分数组可以将复杂度降为O(n)

差分数组讲解

3、解题思路

根据排序不等式,我们开一个cnt数组记录每个位置需要查询的次数,这个过程使用差分数组降低复杂度,然后利用sort排序求出两次结果的差

4、实现代码

#include 
#define ll long long

using namespace std;
typedef pair<int,int>PII;

const int N=1e5+10;
int n,m,ans;
int cnt[N],a[N];


int main(int argc, char** argv) {

	
	cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    
    cin>>m;
    while(m--){
    	int l,r;
    	cin>>l>>r;
    	cnt[l]++,cnt[r+1]--;//差分 
	}
	
	for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1];//求前缀和得出每个位置加了多少次
	
	ll sum1=0,sum2=0;//记录排序前和排序后的sum值 
	for(int i=1;i<=n;i++) sum1+=(ll)cnt[i]*a[i];//注意数据范围最大为1e11所以要强转ll 
	//排序后 
	sort(a+1,a+1+n);
	sort(cnt+1,cnt+1+n);
	for(int i=1;i<=n;i++)sum2+=(ll)cnt[i]*a[i]; 
	cout<<sum2-sum1; 
	 





	return 0;
}

你可能感兴趣的:(排序,算法,蓝桥杯,数据结构,c++)