【16届蓝桥杯寒假刷题营】第1期DAY5

embedded/2025/1/23 5:05:47/

5.依依的询问最小值 - 蓝桥云课

问题描述

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

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

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

输入格式

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

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

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

输出格式

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

样例输入

3 2
1 2 3
1 2
2 3

样例输出

7

思路:

方法一:

下标次数越多说明对应的数值就要最小,这样m 次查询总和就最小。所以我们要记录每一个下标出现的次数降序排序,输入数组的值升序排序。用sum记录它们一一对应相乘和相加即可。但是当m,n很大的时候时间复杂度很高,数值也很大,会失进度和超时。

代码如下:
 

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e5+10;
int n,m;
int arr[N];
int has[N];
bool compare(int a,int b)
{return a > b;
}
int main(void)
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for(int i = 1 ; i <= n ; i++){cin >> arr[i];}int l,r;while(m--){cin >> l >> r;for(int j = l ; j <= r ; j++){has[j]++;}}sort(has + 1, has + 1 + n,compare);//对has数组降序 sort(arr + 1,arr + 1 + n);//对arr数组升序排序int sum = 0;for(int i = 1 ; i <= n ; i++){sum += arr[i] * has[i];	} cout << sum;} 

方法二:
面对这种区间问题,我们需要用到差分数组优化。差分数组可以很好的将一个区间同时增加,减少。对于这道题只有增加出现次数的下标。所以差分数组一开始都为0。待到全部区间操作完毕,用   dif[i] += dif[i - 1];  // 累加差分数组得到实际频率。得到实际数组。

代码如下:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const ll N = 1e5+10;
ll n,m;
ll arr[N];
ll dif[N];
bool compare(ll a,ll b)
{return a > b;
}
int main(void)
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for(ll i = 1 ; i <= n ; i++){cin >> arr[i];}ll l,r;while(m--){cin >> l >> r;dif[l] += 1;if(r+1 <= n)//注意边界dif[r+1] -= 1;	}//通过差分数组实现原本数组for (ll i = 1; i <= n; i++){dif[i] += dif[i - 1];  // 累加差分数组得到实际频率}sort(dif + 1, dif + 1 + n,compare);//对dif数组降序 sort(arr + 1,arr + 1 + n);//对arr数组升序排序ll sum = 0;for(ll i = 1 ; i <= n ; i++){sum += arr[i] * dif[i];	} cout << sum;} 


http://www.ppmy.cn/embedded/156234.html

相关文章

关于linux的ld.so.conf.d

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Linux常用汇总

文件操作 mkdir&#xff08;创建文件夹&#xff09; mkdir -pv /mnt/test/x/m /mnt/test/ymkdir -pv /mnt/test/{x/m,y}rm&#xff08;删除&#xff09; -i 删除之前确认 -f 不确认 -r 递归删除注意&#xff1a; rm -rf 自杀查看时间 date #2021年 12月 16日 星期四 21:3…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

Windows远程桌面网关出现重大漏洞

微软披露了其Windows远程桌面网关&#xff08;RD Gateway&#xff09;中的一个重大漏洞&#xff0c;该漏洞可能允许攻击者利用竞争条件&#xff0c;导致拒绝服务&#xff08;DoS&#xff09;攻击。该漏洞被标识为CVE-2025-21225&#xff0c;已在2025年1月的补丁星期二更新中得到…

.NET开源的处理分布式事务的解决方案

前言 在分布式系统中&#xff0c;由于各个系统服务之间的独立性和网络通信的不确定性&#xff0c;要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库&#xff1a;CAP。 CAP项目介绍 C…

[0242-06].第06节:SpringBoot对SpringMVC的自动配置

SpringBoot学习大纲 一、基于SpringBoot搭建Web工程&#xff1a; 1.1.编码实现步骤&#xff1a; a.创建SpringBoot项目 b.选中依赖&#xff1a;选中我们所需要的模块 1.2.SSM中的WEB开发配置与SpringBoot中WEB开发自动配置对比&#xff1a; a.SSM中的WEB开发&#xff1a; 1…

非局域网win实现远程桌面控制ubuntu

如果你想使用 VNC 从 Windows 电脑连接到 Ubuntu 电脑&#xff0c;下面是详细的步骤指南&#xff0c;包括在 Ubuntu 和 Windows 电脑上需要做的操作。 在 Ubuntu 电脑上配置 VNC 安装 VNC 服务器&#xff1a; 你可以使用 TigerVNC 或 x11vnc 作为 VNC 服务器&#xff0c;下面是…

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中&#xff0c;基于 Cookie 的身份鉴权是一种常见的身份验证方式&#xff0c;特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据&#xff0c;从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…