前缀和、差分数组:重新排序

news/2025/2/15 23:18:18/

L,r重新排序

问题描述

给定一个数组 A A A 和一些查询 L i , R i L_{i}, R_{i} Li,Ri, 求数组中第 L i L_{i} Li 至第 R i R_{i} Ri 个元素之和。

小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查 询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少?

输入格式

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

第二行包含 n n n 个整数 A 1 , A 2 , ⋯ , A n A_{1}, A_{2}, \cdots, A_{n} A1,A2,,An, 相邻两个整数之间用一个空格分隔。

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

接下来 m m m 行, 每行包含两个整数 L i 、 R i L_{i} 、 R_{i} LiRi, 相邻两个整数之间用一个空格分 隔。

输出格式

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

样例输入

5
1 2 3 4 5
2
1 3
2 5

样例输出

4

样例说明

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

评测用例规模与约定

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

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

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

对于所有评测用例, 1 ≤ n , m ≤ 1 0 5 , 1 ≤ A i ≤ 1 0 6 , 1 ≤ L i ≤ R i ≤ 1 0 6 1 \leq n, m \leq 10^{5}, 1 \leq A_{i} \leq 10^{6}, 1 \leq L_{i} \leq R_{i} \leq 10^{6} 1n,m105,1Ai106,1LiRi106

解题思路

分析
1、确定内容
给定查询区间,排序前和排序后询问的区间是一样的,则 m m m个查询区间中计算出每个位置 j j j的累计查询次数 s [ j ] s[j] s[j]是确定的
2、期望
最大的数值被查询的次数最多
3、查询区间的含义
每次查询区间 [ L i , R i ] [L_i,R_i] [Li,Ri],相当于区间 [ L i , R i ] [L_i,R_i] [Li,Ri]中的每个数字查询次数 + 1 +1 +1。为了统计每个数字的查询次数,需要实现区间加法
区间内每个位置被查询一次 ≡ \equiv 修改区间+1——差分数组、线段树

差分数组现区间更新:

  • 在区间 [ L i , R i ] [L_i,R_i] [Li,Ri] + 1 +1 +1,只需要在差分数组 b [ L i ] + + , b [ R i ] − − b[L_i]++,b[R_i]-- b[Li]++b[Ri]
  • 最终 s [ j ] = ∑ i = 1 j b [ i ] s[j]=\sum_{i=1}^j b[i] s[j]=i=1jb[i]

查询之和相当于统计每个位置的查询次数: × \times ×位置上的数:
s u m 1 = ∑ j = 1 n A j s [ j ] sum_1=\sum_{j=1}^nA_js[j] sum1=j=1nAjs[j]
任务需求:需要对数组 A A A进行排序,使得新的 s u m sum sum最大。
贪心:查询次数越多,数值一定越大。这样才能保证和最大。
方法:对 A A A数组和 s s s数组从小到大排序(使得 A A A中最小的对应 s s s中最小的, A A A中最大的对应 s s s中最大的)

AC_Code(Python)

# -*- coding: utf-8 -*-
# @Author : BYW-yuwei
# @Software: python3.8.6
#输入
n = int(input())
a = list(map(int, input().split()))
a = [0, *a]
b = [0] * (n + 10)
s = [0] * (n + 1)m = int(input())
for i in range(m):#差分数组实现区间加法更新l, r = map(int, input().split())b[l] += 1b[r + 1] -= 1
#对差分数组求前缀和,得到每个数字的查询次数
for i in range(1, n + 1):s[i] = s[i - 1] + b[i]#sum1为原始和,sum2为贪心后的最大和
sum1, sum2 = 0, 0
for i in range(1, n + 1):sum1 += a[i] * s[i]a.sort()
s.sort()for i in range(1, n + 1):sum2 += a[i] * s[i]
print(sum2 - sum1)

http://www.ppmy.cn/news/565460.html

相关文章

如何 1天看完 MySQL 45 讲

拳不离手,曲不离口 !! 端午假,我在朋友圈逛遍了天涯海角,古今中外,甚至还有上天入地。马上假期结束,我想程序员们一定会有一种手生的感觉 所以,今天写下点技巧,快速帮大家找回写 SQL 的感觉。 这…

笔记本PS/2键盘无法使用,试下这个方法

用360清理了一下系统,再开机键盘就不灵了,鼠标却可以用。 打开设备管理器,看到PS/2标准键盘有个黄色的感叹号。 属性显示PS/2 标准键盘 Windows 无法加载这个硬件的设备驱动程序。驱动程序可能已损坏或不见了。 (代码 39) 用驱动精灵也不行。…

Sparse Fuse Dense: 向高质量的深度补全3D检测迈进

点云的稀疏性:在远距离和遮挡区域提供的信息较差,导致难以生成精确的3D边界框。 出现了多模态融合。 图像和点云的不同表示方式使得它们难以融合,导致性能不佳。 论文提出了一种新颖的多模态框架SFD(Sparse Fuse Dense&#xf…

AI生成--前端字符串算法

前端字符串算法涉及到字符串的各种操作,比如字符串匹配、查找、替换、截取、拆分等等。 字符串匹配算法 字符串匹配算法可以判断一个字符串中是否包含另一个字符串。 1.1. indexOf() indexOf()方法可以检索字符串中是否含有指定的子字符串,如果有则返…

腾讯云点播功能

文档中心 : https://cloud.tencent.com/document/product/266/9044 FR:徐海涛(hunk Xu) QQ技术交流群:386476712

阿里云视频点播的使用

1.简介:视频点播(ApsaraVideo for VoD)是集音视频采集、编辑、上传、自动化转码处理、媒体资源管理、分发加速于一体的一站式音视频点播解决方案。 2.视频点播的使用: 2.1引入相关依赖:阿里云上有也可以进行直接使用 …

云-腾讯云-云点播:云点播(VOD)

ylbtech-云-腾讯云-云点播:云点播(VOD) 提供端到端的一站式VpaaS音视频点播解决方案 1.返回顶部 1、 云点播(Video on Demand,VOD)基于腾讯多年技术积累与基础设施建设,为有音视频应用相关需求…

阿里云视频点播服务端API和SDK测试

一 准备工作 1 设置不转码 测试之前设置默认“不转码”,以节省开发成本。 2 找到子账户的AccessKey ID 3 给子账户添加授权 AliyunVODFullAccess 4 阅读文档 服务端API API调用示例参考:https://help.aliyun.com/document_detail/44435.html?sp…