【AcWing每日一题】4655. 重新排序

简介: 【AcWing每日一题】4655. 重新排序

给定一个数组 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≤105,1≤Ai≤106,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。

思路:

  • 对区间的数进行操作,用到的是差分算法
  • 如果对于每个询问都单独计算区间内的和,复杂度会到达O(n2),会超时
    由于每次询问的区间对于数的操作只有一次,所以可以利用一个数组记录原数组每个位置的数的操作次数这是对区间[l,r]内的每一个数都加c的操作,所以用到差分算法。
  • 标记好操作次数之后,先用原数组的每一个数乘以每个数的操作次数得到原来的总和
    然后对于操作次数和原数组都按同样的顺序排序,这样,利用排序不等式原理,两个上升的数组的乘积和是最大的,从而得到最大的总和
  • 两个总和一减就是答案

代码:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N], s[N];     //a存储原数组, cnt用作s的差分,记录每个数的操作次数 
int n, m, k, l, r;
LL sum1, sum2;
int main(){
  cin >> n;
  for(int i = 1; i <= n; i++) cin >> a[i];
  cin >> m;
  for(int i = 0; i < m; i++){
    cin >> l >> r;
    s[l]++;
    s[r+1]--; 
  }
  for(int i = 1; i <= n; i++) s[i] += s[i-1];
  for(int i = 1; i <= n; i++) sum1 += (LL)s[i]*a[i];
  sort(s+1, s+n+1);
  sort(a+1, a+n+1);
  for(int i = 1; i <= n; i++) sum2 += (LL)s[i]*a[i];
  cout << sum2-sum1;
  return 0;
}
相关文章
|
机器学习/深度学习 IDE 开发工具
超越笔记本:JupyterLab 的功能扩展
【8月更文第29天】随着数据科学和机器学习的发展,交互式计算环境的需求也日益增长。Jupyter Notebook 作为这一领域的领头羊,已经得到了广泛的应用。然而,为了满足更加复杂的工作流需求,Jupyter 开发者们推出了 JupyterLab —— 一个下一代的交互式计算环境。本文将探讨 JupyterLab 相对于传统 Jupyter Notebook 的增强功能,并通过具体示例展示这些新特性如何提升工作效率。
594 1
|
Java 测试技术 API
Java 反射机制:深入解析与应用实践
《Java反射机制:深入解析与应用实践》全面解析Java反射API,探讨其内部运作原理、应用场景及最佳实践,帮助开发者掌握利用反射增强程序灵活性与可扩展性的技巧。
447 5
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
在Python异步编程领域,协程与异步函数成为处理并发任务的关键工具。协程(微线程)比操作系统线程更轻量级,通过`async def`定义并在遇到`await`表达式时暂停执行。异步函数利用`await`实现任务间的切换。事件循环作为异步编程的核心,负责调度任务;`asyncio`库提供了事件循环的管理。Future对象则优雅地处理异步结果。掌握这些概念,可使代码更高效、简洁且易于维护。
221 1
|
存储 Shell 数据处理
深入探讨Bash脚本中的数组
【8月更文挑战第20天】
226 0
|
人工智能 自然语言处理 搜索推荐
声临其境!体验阿里云开源音频基座大模型——FunAudioLLM
阿里通义实验室开源了全新的音频基座大模型FunAudioLLM,包含SenseVoice与CosyVoice两大核心模型。SenseVoice专精于多语言语音识别、情感辨识与声音事件检测,支持50余种语言,中文及粤语识别准确率提升50%以上。CosyVoice则擅长语音合成,只需3-10秒原始音频即可克隆音色,并支持跨语言合成。FunAudioLLM的应用场景广泛,包括语音到语音翻译、情感语音对话、互动播客及有声读物等。CosyVoice的在线体验显示,其生成的语音自然流畅,支持定制化及高级情绪控制,超越竞品ChatTTS。SenseVoice在情感识别及长音频处理方面表现出色。
26858 28
|
SQL 关系型数据库 数据库
关系型数据库SQLserver查询数据
【7月更文挑战第28天】
188 4
|
数据可视化 iOS开发
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
339 4
|
SQL 机器学习/深度学习 分布式计算
【大数据架构】Apache Flink和Apache Spark—比较指南
【大数据架构】Apache Flink和Apache Spark—比较指南
【大数据架构】Apache Flink和Apache Spark—比较指南
|
XML 存储 Java
五分钟实现pdf分页
抱歉也开始用了这么“标题党”的标题。事情起源于前几天需要把个人资料的pdf文档一页一页的拆出来,好传到相关的网站上。直接截图到word再转pdf比较麻烦,所以想用工具直接转换。结果找了几个pdf阅读器,这类操作都需要会员或收费。作为一名程序员,这么简单的操作还要收费显然是一种羞耻(当然我是不会承认主要是因为qiong的),几分钟就可以代码解决的问题为啥要花钱呢?废话不多说,开搞。
458 0
|
存储 缓存 算法
golang本地缓存选型及原理总结
golang本地缓存选型及原理总结