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

【蓝桥杯每日一题】重新排序

重新排序

2024-12-8 蓝桥杯每日一题 重新排序 前缀和 差分

题目大意

给定一个数组 A 和一些查询 L i , R i Li_,R_i Li,Ri, 求数组中第 L i L_i Li至第 R i R_i Ri个元素之和。

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

解题思路

首先看到题一定会想到前缀和,因为要求数组中某一个区间的和。

分析这个题,想要某些区间里的和达到最大,那么可以让那些重合计算的位置能够交换到最大的值,以此达目的。

然后就是计算每一个位置的使用使用次数,可以通过差分,这里涉及到对某些区间的一个 +1 。

最后想要给这些使用次数最多的分配到可行的最大值,那么可以通过排序,将原数组和使用的次数都进行一个排序,那么这时候就满足上述那个要求;然后分别计算两次的总和相减即可。

举例:

1 2 3 4 5    	1 3   2 5
1 2 2 1 1 排序:	
1 2 3 4 5 
1 1 1 2 2
Accepted
//  不开 long long 见祖宗
#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int N = 100010;
ll a[N],b[N],c[N];
ll n,m;void diff(int l,int r) {b[l] += 1;b[r + 1] -= 1;
}int main()
{cin>>n;for(int i = 1 ;i <= n ;i++ ) {cin>>a[i];c[i] = c[i-1] + a[i];}cin>>m;ll cnt = 0;for(int i = 1;i <= m;i++) {int l,r;cin>>l>>r;diff(l,r);cnt += c[r] - c[l-1];}for(int i = 1;i <= n;i++) {b[i] = b[i-1] + b[i];}sort(b+1,b+n+1);sort(a+1,a+n+1);ll pre = 0;for(int i = 1;i <= n;i++) {pre += a[i] * b[i];}cout<<pre - cnt<<endl;return 0;
}
思考

当时的思考已经分析到了使用次数,就差最后的一个神来之笔——排序求解。

备注

想要一起备赛的小伙伴可以私信加我的联系方式!

http://www.lryc.cn/news/500194.html

相关文章:

  • 《深入浅出HTTPS》读书笔记(16):消息验证码算法分类
  • 如何使用Apache HttpClient来执行GET、POST、PUT和DELETE请求
  • 数据结构-希尔排序
  • Spire.doc 合并word,复制word
  • 【Spring项目】表白墙,留言板项目的实现
  • 分布式事务-nacos/seata在windows环境下部署及开发
  • 分布式微服务架构下的密码安全性方案
  • 基于pytorch的深度学习基础4——损失函数和优化器
  • 网络安全信息收集(总结)更新
  • web斗地主游戏实现指北
  • SpringMVC其他扩展
  • 【Linux】网络服务
  • 工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法
  • IDL学习笔记(五)MODIS数据(Grid)
  • JavaScript语言介绍
  • Lua使用点号和冒号的区别
  • LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程
  • Ansible的yum和saltstack的哪个功能相似
  • paimon0.9记录
  • Java 中 List 接口的学习笔记
  • 【原生js案例】webApp实现鼠标移入移出相册放大缩小动画
  • LVGL9 定时器模块
  • Qt学习笔记第51到60讲
  • 网页设计--axios作业
  • SpringBoot 整合 Avro 与 Kafka 详解
  • 若依 ruoyi VUE el-select 直接获取 选择option 的 label和value
  • 大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
  • 修改MySQL存储路径
  • Git常用的命令【提交与回退】
  • 详解:HTTP/HTTPS协议