【寒假每日一题】AcWing 4655. 重新排序(补)

简介: 目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴1、前缀和与差分2、排序不等式

一、题目

1、原题链接

4655. 重新排序 - AcWing题库


2、题目描述

给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li 至第 Ri 个元素之和。


小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。


小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?


输入格式


输入第一行包含一个整数 n。


第二行包含 n 个整数 A1,A2,⋅⋅⋅,An,相邻两个整数之间用一个空格分隔。


第三行包含一个整数 m 表示查询的数目。


接下来 m行,每行包含两个整数 Li、Ri,相邻两个整数之间用一个空格分隔。


输出格式


输出一行包含一个整数表示答案。


数据范围


对于 30% 的评测用例,n,m≤50;

对于 50% 的评测用例,n,m≤500;

对于 70% 的评测用例,n,m≤5000;

对于所有评测用例,1≤n,m≤10^5,1≤Ai≤10^6,1≤Li≤Ri≤n。


输入样例:


5

1 2 3 4 5

2

1 3

2 5

输出样例:


4

样例解释


原来的和为 6+14=20,重新排列为 (1,4,5,2,3)后和为 10+14=24,增加了 4。


二、解题报告

思路来源:up主,可以解释一下众人拾柴火焰高的含义吗?每日一题_哔哩哔哩_bilibiliy总yyds


1、思路分析

1)先创建一个数组来记录各个位置上的数需要被加多少次,初识化都是0,可以利用差分,对每次对给定区间上的数+1。


2)对差分后的数组求前缀和,即可得到一个记录了各个位置需要被加多少次的数组。


3)对原数组和2)中求得的数组,每项相乘再求和,即可得到m次询问中,原数组的所询问区间中的数的和sum0。


4)题目要求和最大,利用排序不等式可知,两数组“顺序”相乘和最大,所以对两数组进行相同的排序操作,然后再求每项相乘再求和的结果,即为所求和最大,记为sum。


5)输出sum-sum0即为所求。


2、时间复杂度

时间复杂度为O(n)

3、代码详解

#include <iostream>

#include <algorithm>

using namespace std;

int A[100010],c[100010];

int main()

{   int n;

   cin>>n;

   for(int i=1;i<=n;i++){

    cin>>A[i];

}

int m;

cin>>m;

int L,R;

//差分

for(int i=0;i<m;i++){

 cin>>L>>R;

 c[L]++;

 c[R+1]--;

}

//前缀和

for(int i=1;i<=n;i++){

 c[i]+=c[i-1];

}

long long sum0=0,sum=0;

for(int i=1;i<=n;i++){

 sum0+=(long long)A[i]*c[i];

}

//排序不等式

sort(A+1,A+n+1);

sort(c+1,c+n+1);

for(int i=1;i<=n;i++){

 sum+=(long long)A[i]*c[i];//记得转longlong,否则超int范围

}

cout<<sum-sum0;

return 0;

}


三、知识风暴

1、前缀和与差分

1)前缀和可以用来求指定区间的元素之和,满足Sn=Sn-1+an,即前n项和等于前n-1项和加第n个元素。例如Sk为前k项的前缀和,Sm-1为前m-1项和,则从第m个元素到第k个元素之和为Sk-Sm-1。


2)差分可以用来对指定区间的元素同时加减某任意常数C。具体操作:如果对第m个元素到第k个元素同时加上C,则可以先定义一个差分数组,初识化:差分数组第一个元素与原数组第一个元素相同,对于之后每一个元素都有第i个元素等于原数组第i个元素值-原数组第i-1个元素的值,大小与需要处理的数组大小一致,然后对差分数组的第m个元素加C,第k+1个元素减C,然后再对差分数组求前缀和,所得数组就是所需的结果。(输入原数组时,建议从下标1开始输入,处理差分数组时比较方便直接c[m]+=c,c[k+1]-=c)


注:差分数组是前缀和的逆运算。


2、排序不等式

直接上结论:两个等长数列每项相乘再相加的和,“顺序”相乘(大数乘大数、次大乘次大、直到最小乘最小)该和最大,“逆序”相乘(最大乘最小、次大乘次小、...)该和最小,其他情况位于两者之间。


目录
相关文章
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
370 0
vw、px、vh 和 rem应用场景以及区别
【4月更文挑战第2天】 vw、px、vh 和 rem应用场景以及区别
1331 10
|
存储
[simulink] --- simulink模块(三)
[simulink] --- simulink模块(三)
1520 0
|
SQL 关系型数据库 MySQL
docker上定期备份mysql数据库
本文是博主学习docker的记录,希望对大家有所帮助。
1641 0
|
9月前
|
自然语言处理 数据可视化 BI
多部门协作难题有解!推荐几款实用的企业协作平台
在现代商业环境中,高效协作工具对于团队成功至关重要。本文推荐5款协作平台:板栗看板、Trello、Asana、Monday.com和ClickUp,它们分别在任务管理、实时沟通、数据安全等方面表现出色,帮助企业实现高效管理,提升项目成功率。选择合适的工具,可以显著提高团队效率和协作效果。
371 0
|
12月前
|
人工智能 自然语言处理 机器人
谷歌将大模型集成在实体机器人中,能看、听、说执行57种任务
【9月更文挑战第17天】近年来,人工智能在多模态大模型领域取得显著进展。谷歌最新研发的Mobility VLA系统,将大模型与实体机器人结合,实现了视觉、语言和行动的融合,使机器人能理解并执行复杂多模态指令,如“我应该把这个放回哪里?”系统在真实环境测试中表现出色,但在计算资源、数据需求及伦理问题上仍面临挑战。相关论文发布于https://arxiv.org/abs/2407.07775。
238 9
|
NoSQL 前端开发 MongoDB
[保姆级教程]Windows安装MongoDB教程
【6月更文挑战第4天】该内容是关于MongoDB的安装包下载及安装步骤指南。首先,访问网址 &lt;a href=&quot;https://www.mongodb.com/try&quot; target=&quot;_blank&quot;&gt;https://www.mongodb.com/try&lt;/a&gt; 进入官网,选择MongoDB Community Edition(社区版)。接着,挑选合适的版本和系统平台,推荐下载zip压缩包。下载后,进行安装,依次点击“Next”同意协议,选择自定义安装路径,然后继续安装直至完成。
1358 0
|
11月前
|
druid Java Maven
|
存储 KVM 虚拟化
倚天产品介绍|倚天虚拟化:虚拟机热迁移特性介绍
热迁移分为热迁移和冷迁移,冷迁移过程中有一段明显的时间VM的服务不可用,而热迁移的服务的服务暂停时间非常短。热迁移过程中无需关闭或者长时间暂停VM,VM保持正常运行,只有在热迁移临近结束时有一个非常短暂的停机切换时间。热迁移可保证了VM服务的可用性,提升业务的连续性和用户体验。
|
XML 缓存 NoSQL
手把手实现第三方社交登录方式微信登录
手把手实现第三方社交登录方式微信登录
304 0