首页 > 其他分享 >AcWing4655.重新排序

AcWing4655.重新排序

时间:2023-01-05 11:02:16浏览次数:62  
标签:AcWing4655 int sum long 1e5 重新 数组 ans 排序

题目

原题链接

参考题解

AcWing4655.重新排序

image

思路

用两个数组,一个数组\(a\)来记录原数组,\(b\)数组来记录每个数字被计算了多少次,题目中给的是$ [l,r] $区间内的数字求和,也就是每次给的 \([l,r]\)区间内的数字都会被计算一次,即\(b[l,r]\)上的数都要+1,不妨用一个差分数组来统计,b[l] ++,b[r+1] --,然后对\(b\)这个差分数组求前缀和,所得的前缀和数组就是所要的记录每个数字被统计了多少次的数组

对\(b\)差分数组求一遍前缀和(还是用\(b\)数组存结果),现在得到了两个数组\(a\)和\(b\)

两数组一个是原元素数组,一个是某个数字统计的频数数组
让和最大就要尽可能让数值大的元素的频数大,那就让两个数组都sort一遍

计算\(\sum _{i=1}^{n}a_{i}\cdot b_{i}\)就是原始的\(sum\)

对\(a\)、\(b\)两数组sort得到的结果再计算\(\sum _{i=1}^{n}a_{i}\cdot b_{i}\)就是期望最大和的结果\(ans\)

最后答案就是\(ans - sum\)

一个数字最多被计算1e5次,所以一个数最大是1e5 * 1e6,和最大是1e5 * 1e6 * 1e5,肯定会爆int,开long long存sum、ans

代码

#include<iostream>
#include<algorithm>

using namespace std;

typedef long long LL;
const int N = 1e5+10;

int a[N],b[N];
LL sum,ans;
int n,m;

int main()
{
    cin >> n ;
    for(int i = 1;i <= n;i ++) cin >> a[i];
    
    cin >> m ;
    for(int i = 1;i <= m;i ++)
    {
        int l,r;
        cin >> l >> r ;
        b[l] ++ ,b[r + 1] -- ;
    }
    
    for(int i = 1;i <= n; i ++)
    {
        b[i] = b[i - 1] + b[i] ;
        sum += (LL) a[i]*b[i] ;
    }
    
    sort(a+1,a+n+1),sort(b+1,b+n+1);
    
    for(int i = 1;i <= n;i ++)
    {
        ans += (LL) a[i]*b[i];
    }
    
    cout << ans - sum;
    
    return 0;
}

标签:AcWing4655,int,sum,long,1e5,重新,数组,ans,排序
From: https://www.cnblogs.com/rdisheng/p/17026923.html

相关文章

  • SQL 分组(分区)排序获取第一条数据 ROW_NUMBER() OVER() PARTITION BY的使用
    有一张价格“订单价格设置”表如下:商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小),价格的时间段,商品价格 现在要求选出每个商品价格最大,价格设......
  • CC6 牛牛的排序
    描述牛牛试图给一个长度为n整数数组排序,即实现一个voidsort(int*array,intn)输入描述:第一行输入一个正整数n,表示数组长度。第二行输入n个正整数,表示数组中每......
  • 程序:冒泡排序
    #include<stdio.h>voidbubble_sort(intarr[],intsz){inta=0;for(a=0;a<sz-1;a++){intb=0;for(b=0;b<sz-1-a;b++){i......
  • 2023 重新开始
    误入网络安全这个行业有三年多了,这三年主要工作就是等保里面的渗透,基本项目都在重复劳动,三年下来跟刚入行的时候水平差不多,没学到什么技术。浑浑噩噩度过了三年,自......
  • 插入排序
    #InsertionSort插入排序defsort_integers(self,a:List[int]):foriinrange(2,len(a)+1):#i=2,3,4...#做len(a)-1次循环forji......
  • 重新编译gluster_exporter源码,构建镜像
    1.githubhttps://github.com/ofesseler/gluster_exporter 2.dockerfileFROMgolang:1.17ENVGO111MODULE=on\GOPROXY="https://goproxy.cn,direct"COPYglus......
  • 重新编译keepalived-exporter源码,构建镜像
    1.githubhttps://github.com/mehdy/keepalived-exporter 2.dockerfileFROMgolang:1.17ENVGO111MODULE=on\GOPROXY="https://goproxy.cn,direct"COPYkeepa......
  • 数据结构-堆排序
    文章目录​​1、向下调整​​​​2、向上调整​​​​3、建立堆​​​​4、堆排序​​​​5、删除堆首​​​​6、增加元素​​​​7、完成代码​​堆是由一维数组存储的完......
  • 一些 NuGet 程序包是使用不同于当前目标框架的目标框架安装的,可能需要重新安装
    何时重新安装包包还原后的损坏引用:如果已打开项目并还原了NuGet包,但仍看见了损坏的引用,请尝试重新安装每个包。项目因删除文件损坏:NuGet不会阻止删除从包添加的项,因......
  • [MYSQL] 自动排序函数
    rank()ovre(业务逻辑)并列排序,会跳过重复序号dense_rank()over(业务逻辑)并列排序,不会跳过重复序号dense_rank()over排名是密集连续的row_number()顺序排序,不......