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

练习-依依的询问最小值(前缀和差分)

问题描述

依依有个长度为 n 的序列 a,下标从 1 开始。

她有 m 次查询操作,每次她会查询下标区间在[li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a,使得这 m 次查询的总和最小。

求你求出 m 次查询总和的最小值。

输入格式

第一行输入两个整数 n,m,表示序列 a 的长度以及查询次数。

第二行输入 n 个整数 ai​,表示序列 a 中的元素。

接下来 m 行,每行输入两个整数 li,ri(1≤li≤ri≤n),表示询问的下标区间。

输出格式

输出仅一行,包含一个整数,表示 m 次查询总和的最小值。

样例输入

3 2
1 2 3
1 2
2 3

样例输出

7

样例解释

1. 输入
  • 序列 a=[1,2,3]a=[1,2,3]。

  • 查询区间:

    • [1,2]:a[1]+a[2]

    • [2,3]:a[2]+a[3]

2. 计算每个索引被查询的次数
  • 索引 1:被查询区间 [1,2]覆盖,次数为 1。

  • 索引 2:被查询区间 [1,2]和 [2,3] 覆盖,次数为 2。

  • 索引 3:被查询区间 [2,3]覆盖,次数为 1。

3. 重新排列序列 a
  • 将较大的元素分配给被较少查询区间覆盖的索引,将较小的元素分配给被较多查询区间覆盖的索引。

  • 索引 2 被查询的次数最多,因此应该分配最小的元素。

  • 索引 1 和 3 被查询的次数较少,可以分配较大的元素。

重新排列后的序列:

  • 索引 1:3

  • 索引 2:1

  • 索引 3:2

即 a=[3,1,2]。

4. 计算查询区间的元素和
  • [1,2]:a[1]+a[2]=3+1=4

  • [2,3]:a[2]+a[3]=1+2=3

5. 总和
  • 总和为 4+3=74+3=7。


1. 问题分析

  • 目标:通过重新排列序列 a,使得所有查询区间的元素和的总和最小。

  • 查询区间:每个查询区间 [li,ri] 的元素和是 a[li]+a[li+1]+⋯+a[ri]。

  • 操作:只能重新排列序列 a,不能修改或删除元素。


2. 关键观察

1. 查询区间的重叠
  • 不同的查询区间可能会重叠,导致某些索引被多次查询。

  • 例如,查询区间 [1,3]和 [2,4] 重叠在索引 2 和 3。

2. 元素分配的策略
  • 如果一个索引被多个查询区间覆盖,那么该索引的值会对多个查询区间的元素和产生影响。

  • 为了最小化总和,我们应该将较大的元素分配给被较少查询区间覆盖的索引,将较小的元素分配给被较多查询区间覆盖的索引。

3. 差分数组的使用
  • 差分数组可以高效地统计每个索引被查询的次数。

  • 通过差分数组,我们可以在 O(n+m) 的时间复杂度内计算出每个索引被查询的次数。

4. 排序和分配
  • 将查询次数从小到大排序,将序列 a 从大到小排序。

  • 将较大的元素分配给被较少查询区间覆盖的索引,将较小的元素分配给被较多查询区间覆盖的索引。


3. 解决思路

基于以上观察,我们可以设计以下解决思路:

  1. 统计每个索引被查询的次数

    • 使用差分数组统计每个索引被查询的次数。

    • 通过前缀和数组计算每个索引被查询的次数。

  2. 排序

    • 将查询次数从小到大排序。

    • 将序列 a 从大到小排序。

  3. 分配元素

    • 将较大的元素分配给被较少查询区间覆盖的索引,将较小的元素分配给被较多查询区间覆盖的索引。

  4. 计算最小总和

    • 计算所有查询区间的元素和的总和。


解题代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
int g[N]; // 差分数组,用于统计每个索引被查询的次数
int prefix[N]; // 前缀和数组,用于计算每个索引被查询的次数
int a[N]; // 存储输入的序列 a// 自定义排序函数,用于将数组从大到小排序
bool cmp(int u, int v)
{return u > v;
}int main()
{int n, m; // n 是序列长度,m 是查询次数long long cnt = 0; // 用于存储最小总和cin >> n >> m; // 输入序列长度 n 和查询次数 m// 输入序列 a,索引从 1 开始for (int i = 1; i <= n; i++){cin >> a[i];}// 使用差分数组统计每个索引被查询的次数while (m){int l, r; // 查询区间的左右端点cin >> l >> r;g[l]++; // 从 l 开始,查询次数增加 1g[r + 1]--; // 从 r + 1 开始,查询次数减少 1m--; // 处理完一个查询,m 减 1}// 计算每个索引被查询的次数prefix[1] = g[1]; // 初始化 prefix[1]for (int i = 2; i <= n; i++){prefix[i] = prefix[i - 1] + g[i]; // 计算 prefix[i]}// 将 prefix 数组从小到大排序sort(prefix + 1, prefix + 1 + n);// 将 a 数组从大到小排序sort(a + 1, a + 1 + n, cmp);// 计算最小总和for (int i = 1; i <= n; i++){cnt += a[i] * prefix[i]; // 将较大的元素分配给被较少查询区间覆盖的索引}cout << cnt;return 0;
}

相关文章:

练习-依依的询问最小值(前缀和差分)

问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在[li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次查询总和的最小值。 输入格式 第…...

ctfshow web刷题记录

RCE 第一题 eval代码执行 &#xff1a; 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…...

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分&#xff08;2018年-2023年&#xff09;的易错题及相应的知识点整理&#xff0c;后期复习也常常用到&#xff0c;对于知识提炼归纳理解起到了很大的作用&#xff0c;分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…...

卷积神经网络(CNN)之 EfficientNet

在深度学习领域&#xff0c;模型的计算效率与性能之间的平衡一直是一个核心挑战。随着卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测等任务中取得显著成果&#xff0c;模型的复杂度和计算需求也急剧增加。2019年&#xff0c;Google Research 提出的 EfficientN…...

【eNSP实战】将路由器配置为DHCP服务器

拓图 要求&#xff1a; 为 office100 和 office200 分别配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上创建office100地址池 [AR1…...

工程化与框架系列(35)--前端微服务架构实践

前端微服务架构实践 &#x1f3d7;️ 引言 随着前端应用规模的不断扩大&#xff0c;微服务架构在前端领域的应用越来越广泛。本文将深入探讨前端微服务架构的实现方案、最佳实践和相关工具。 微服务架构概述 前端微服务架构主要包括以下方面&#xff1a; 应用拆分&#xf…...

Windows系统中安装Rust工具链方法

Windows系统中安装Rust工具链方法 在Windows上使用PowerShell的命令来下载rustup-init.exe文件。 此外&#xff0c;安装完成后&#xff0c;需要确保Rust的环境变量生效&#xff0c;可能需要重启终端或手动执行设置路径的命令。然后继续升级pip并安装tiktoken。 总结步骤应该是…...

Postman下载安装及简单入门

一&#xff0e;Postman简介 Postman是一款API测试工具&#xff0c;可以帮助开发、测试人员发送HTTP请求&#xff0c;与各种API进行交互&#xff0c;并分析响应 二&#xff0e;下载与安装 访问Postman官网&#xff08;https://www.postman.com/&#xff09;&#xff0c;下载适…...

vulnhub靶场之loly靶机

前言 挑战攻克该靶机30分钟 靶机&#xff1a;loly靶机&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用桥接网卡模式 文章涉及的靶机及工具&#xff0c;都可以自行访问官网或者项…...

原生微信小程序实现导航漫游(Tour)

效果&#xff1a; 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…...

LLM论文笔记 25: Chain-of-Thought Reasoning without Prompting

Arxiv日期&#xff1a;2024.5.31机构&#xff1a;Google DeepMind 关键词 cot-decoding推理路径pretrain 核心结论 1. LLMs 不需要prompting就可以生成链式推理路径&#xff0c;prompting只是将这些能力显性化的一种手段 2. cot path 往往与更高的model confidence相关&…...

新型XCSSET恶意软件利用增强混淆技术攻击macOS用户

微软威胁情报团队发现了一种新型的XCSSET变种&#xff0c;这是一种复杂的模块化macOS恶意软件&#xff0c;能够感染Xcode项目&#xff0c;并在开发者构建这些项目时执行。 这是自2022年以来的首个已知XCSSET变种&#xff0c;采用了增强的混淆方法、更新的持久化机制以及新的感…...

Redis存数据就像存钱:RDB定期存款 vs AOF实时记账

Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...

[C++面试] 关于deque

一、入门 1、deque与vector的区别 deque的迭代器包含以下信息&#xff1a; 当前缓冲区指针&#xff08;current_buffer&#xff09;当前元素在缓冲区内的位置&#xff08;current&#xff09;中控器的位置&#xff08;map&#xff09; 每次移动迭代器时&#xff0c;需检查是…...

施磊老师c++(七)

STL组件 文章目录 STL组件1.整体学习内容2.vector容器3.deque和listdeque--双端队列容器list--链表容器 4.vector,deque,list对比主要内容面经问题 5.详解容器适配器--stack, queue, priority_queue容器适配器stack-栈queue-队列priority_queue-优先级队列总结 6.无序关联容器关…...

八股文——C 语言宏、`volatile`、`static`、动态内存管理、堆与栈的区别

文章目录 1. #&#xff08;字符串化操作符&#xff09;作用&#xff1a;示例&#xff1a; 2. ##&#xff08;符号连接操作符&#xff09;作用&#xff1a;示例1&#xff1a;动态生成变量名 3. volatile 关键字作用&#xff1a;示例&#xff1a; 4. static 关键字作用&#xff1…...

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象&#xff08;三&#xff09; 上期内容&#xff0c;我们围绕类对象模型的大小计算&#xff0c;成员存储方式&#xff0c;this指针&#xff0c;以及C实现栈和C语言的比较&#xff0c;进一步认识了C的封装特性。本期内容&#xff0c;我们开始介绍类的默认成员函…...

【Function】使用托管身份调用Function App触发器,以增强安全性

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 1. 背景介绍2. 设置3. 使用Web应用调用Function App触发器(Node.js示例)4. 执行结果此方法允许您使用托管身份(Managed Identity)调…...

x012-MSP430F249智能步进电动百叶窗_proteus_光敏电阻_步进电机_仿真

https://www.dong-blog.fun/post/1997 46 、智能步进电动百叶窗 基本要求&#xff1a; 用一台步进电机控制百叶窗叶片的旋转&#xff08;正转/反转&#xff09; 用 LED 数码管显示旋转角度 设置按键&#xff1a; 手动/自动切换、手动正转和手动反转&#xff0c;停止/启动键 用一…...

牛客周赛85 题解 Java ABCDEFG

A小紫的均势博弈 判断输入的 n 是奇数还是偶数 import java.io.*; import java.math.*; import java.util.*;public class Main {static IoScanner sc new IoScanner();static final int mod(int) (1e97);static void solve() throws IOException {int nsc.nextInt();if(n%2…...

# RAG 框架 # 一文入门 全链路RAG系统构建与优化 —— 架构、策略与实践

本文全面阐述了RAG系统从数据收集、数据清洗&#xff08;包括领域专有名词处理&#xff09;、智能数据分块与QA对生成&#xff0c;到向量化、向量数据库选择与配置&#xff0c;再到检索方式及重排序&#xff0c;直至整合输出、监控反馈和安全保障的全流程。通过这一完整方案&am…...

【Golang】第二弹-----变量、基本数据类型、标识符

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、变量 1.1基本介绍…...

c#:使用Modbus RTU协议

Modbus是一种广泛应用于工业自动化领域的通信协议&#xff0c;支持多种传输方式&#xff0c;如RTU、TCP等。其中&#xff0c;Modbus RTU是一种基于串行通信的协议&#xff0c;具有高效、可靠的特点。本文将详细介绍Modbus RTU协议的基本原理&#xff0c;并重点解析功能码0x03&a…...

linux系统CentOS 7版本搭建NFS共享存储

一、什么是NFS共享存储方式 NFS共享存储方式 是一种分布式文件系统协议&#xff0c;允许客户端通过网络访问远程服务器上的文件&#xff0c;就像访问本地文件一样。 二、 NFS的基本概念 &#xff08;1&#xff09;服务器端&#xff1a;提供共享存储的机器&#xff0c;负责导…...

Matlab 基于SVPWM的VF三电平逆变器异步电机速度控制

1、内容简介 略 Matlab 167-基于SVPWM的VF三电平逆变器异步电机速度控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

Android Dagger2 框架依赖图构建模块深度剖析(三)

一、引言 在 Android 开发中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称 DI&#xff09;是一种重要的设计模式&#xff0c;它能够降低代码的耦合度&#xff0c;提高代码的可测试性和可维护性。Dagger 2 作为一款高效的依赖注入框架&#xff0c;在编…...

(一)微服务初见之 Spring Cloud 介绍

微服务架构简介 从单体应用架构发展到SOA架构&#xff0c;再到微服务架构&#xff0c;应用架构经历了多年的不断演进。微服务架构不是凭空产生的&#xff0c;而是技术发展的必然结果&#xff0c;分布式云平台的应用环境使得微服务代替单体应用成为互联网大型系统的架构选择。目…...

python--面试题--基础题

join() 和 split() 函数 join() 函数可以将指定的字符添加到字符串中。 a[my, name, shi, wzngz] print(..join(a)) 输出结果&#xff1a;my.name.shi.wzngz split() 函数可以用指定的字符分割字符串 a"my name shi wzngz " print(a.split()) 输出结果&#xff…...

架构思维:软件建模与架构设计的关键要点

文章目录 1. 软件建模的核心概念2. 七种常用UML图及其应用场景类图时序图组件图部署图用例图状态图活动图 3. 软件设计文档的三阶段结构4. 架构设计的关键实践1. 用例图&#xff1a;核心功能模块2. 部署图&#xff1a;架构演进阶段3. 技术挑战与解决方案4. 关键架构图示例5. 架…...