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

重新排序

1、排序不等式

在这里插入图片描述

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

2、差分

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

差分数组讲解

3、解题思路

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

4、实现代码

#include <bits/stdc++.h>
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值