当前位置: 首页 > news >正文

【算法】差分、前缀和(重新排序)

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

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

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

输入格式

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

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

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

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

输出格式

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

数据范围

对于 30%30% 的评测用例,n,m≤50;
对于 50%50% 的评测用例,n,m≤500
对于 70%70% 的评测用例,n,m≤5000
对于所有评测用例,1≤n,m≤1e5,1≤Ai≤1e6,1≤Li≤Ri≤n。

输入样例:
5
1 2 3 4 5
2
1 3
2 5
输出样例:
4
样例解释

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

分析: 

(1)选中每个不同的区域求和,我们要把每个区域出现的次数做个统计,如1~3,2~5,这两个区域2,3区域的数有两次相加出现两次,其他只有一次,所以可以用差分算法先统计一下每个区域出现的次数,想要结果和最大,就要将最大的数放在累加次数最高的位置

(2)由前缀和,将差分变成每个位置出现次数的数组

(3)和=【数字 * 出现次数】累加,可以去自己简单证明一下

(4)将两个数组排序,在分别用上式就可出最大值

#include<iostream>
#include<algorithm>
#define N 100010
typedef long long LL;
using namespace std;int a[N],diff[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}int m,l,r;cin>>m;for(int i=1;i<=m;i++){cin>>l>>r;diff[l]++,diff[r+1]--;//这是差分数组,变成原数组的意思就是在[l,r]区间+1}for(int i=1;i<=n;i++){diff[i]+=diff[i-1];//通过前缀和,变成每个位置出现次数的数组}int sum1=0;int sum2=0;for(int i=1;i<=n;i++){sum1+=(LL)(a[i]*diff[i]);}sort(a+1,a+n+1);sort(diff+1,diff+n+1);for(int i=1;i<=n;i++){sum2+=(LL)(a[i]*diff[i]);//cout<<sum2;}cout<<sum2-sum1;return 0;
}

相关文章:

  • 外包干了3天,技术明显进步。。。。。
  • Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error
  • 前端结合 react axios 获取真实下载、上传进度
  • Vue3学习日记 Day4 —— pnpm,Eslint
  • 【C++】vector容器初步模拟
  • python初始化二维数据
  • 实体框架EF(Entity Framework)简介
  • linux之shell脚本基础
  • DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection
  • 无线局域网——wlan
  • 【Python 48小时速成 8】函数
  • Spring如何解决循环依赖?
  • macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
  • postgresql查看数据库占用空间大小
  • 《如何使用C语言去下三子棋?》
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Android Studio:GIT提交项目到远程仓库
  • android 一些 utils
  • Angular 响应式表单之下拉框
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES6之路之模块详解
  • idea + plantuml 画流程图
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript 奇技淫巧
  • Mybatis初体验
  • PAT A1092
  • Sublime Text 2/3 绑定Eclipse快捷键
  • ubuntu 下nginx安装 并支持https协议
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 聊聊redis的数据结构的应用
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​水经微图Web1.5.0版即将上线
  • # 达梦数据库知识点
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (12)Linux 常见的三种进程状态
  • (4)logging(日志模块)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (力扣)循环队列的实现与详解(C语言)
  • (三)elasticsearch 源码之启动流程分析
  • (一)基于IDEA的JAVA基础1
  • (转)C#调用WebService 基础
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 依赖注入的基本用发
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net mvc部分视图
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET开发不可不知、不可不用的辅助类(一)