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

「数组」离散化 / Luogu B3694(C++)

目录

概述

思路

算法过程

复杂度

Code


概述

Luogu B3694:

给定一个长度为 n 的数列 aa。定义 rank(i) 表示数列 a 中比 ai 小的不同数字个数再加一。

对 1≤i≤n,现在请你求出所有的 rank(i)。

输出格式

对每组数据,输出一行 n 个整数,用空格隔开,依次示 rank(1)到 rank(n)。

我们来讲一个十分常用的小算法:离散化。 

离散化并不单独作为一个算法出现,而是常作为一个预处理步骤。

所谓离散化,就是使用数组元素的相对排名替代原始数组元素。

例如,

     i  0 1 2 3 4
nums[i] 9 7 4 0 1000↓
nums[i] 4 3 2 1 5

这样我们在保证元素的相对关系的前提下,使得元素的分散程度减小了。

换句话说,如果元素分布范围很大,或者元素是浮点数以及其他类型,在不关注元素的绝对性质时,用离散化处理会使得我们关注的范围更加紧凑。 

离散化在许多只关注元素相对性质的算法里有广泛的应用。

思路

一共有三个数组:原始数组,排序后的原数组,离散化数组。

先复制一份原始数组,对其进行排序,这样(元素下标-数组头指针)就得到了元素在原数组的排名。 

原始数组遍历,对于第i个元素,它在排序后数组中处于pos位置,则离散化数组[i]=pos。

需要注意的是:在考虑重复元素的只占排名时,我们要对排序后数组进行去重。

算法过程

使用C++STL算法库:

sort()排序数组。

unqiue()对排序后数组去重。

lower_bound()利用二分查找找到排序后数组中元素的位置。

排序数组b,

sort(b,b+n);

排序后对数组去重,得到排序后去重数组b[i],

int* end=unique(b,b+n); 

unqiue会将数组中的重复元素转移至数组末位,返回去重后数组无重复区的后一个位置。 

二分查找得到a[i]在b中的位置,减去b得到相对排名,

for(int i=0;i<n;i++)cout<<lower_bound(b,end,a[i])-b+1<<' ';

对于本题,直接输出离散结果即可,另外,题目要求的排序从1开始。 

对于二分查找lower_bound的内部实现:「数组」二分查找模版|二段性分析|恢复二段性 / LeetCode 35|33|81(C++)

对于数组去重unqiue的内部实现:

「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)

复杂度

时间复杂度:O(nlogn)

空间复杂度:O(n)

Code

#include <bits/stdc++.h>
using namespace std;
void solve(){int n;cin>>n;int a[n],b[n];for(int i=0;i<n;i++){cin>>a[i];b[i]=a[i];}sort(b,b+n);int* end=unique(b,b+n);for(int i=0;i<n;i++)cout<<lower_bound(b,end,a[i])-b+1<<' ';cout<<endl;
}
int main(){int t;cin>>t;while(t--)solve();
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [晕事]今天做了件晕事45 ssh 远程执行命令与>
  • 828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问
  • 2.3 数据通信基础知识
  • CAN协议一致性测试——深入浅出理解CAN协议(四)
  • 影刀RPA实战:网页爬虫之药品数据
  • DNS解析常见问题:什么是DNS泛解析?如何设置泛解析?
  • LabVIEW软件维护的内容是什么呢?
  • 1.5 计算机网络的性能指标
  • Docker自定义构建镜像dockerfile和使用数据卷
  • lettuce引起的Redis command timeout异常
  • Linux入门2
  • 设计支持 50 万 QPS 的站内未读消息系统
  • 【ShuQiHere】 探索数据挖掘的世界:从概念到应用
  • 安全测试|如何使用burpsuite+xray实现联动测试
  • windows远程控制[机房电脑-本机] 解决黑屏问题
  • 77. Combinations
  • AngularJS指令开发(1)——参数详解
  • E-HPC支持多队列管理和自动伸缩
  • Just for fun——迅速写完快速排序
  • MySQL用户中的%到底包不包括localhost?
  • React Native移动开发实战-3-实现页面间的数据传递
  • windows下mongoDB的环境配置
  • 阿里云Kubernetes容器服务上体验Knative
  • 从零开始学习部署
  • 前端临床手札——文件上传
  • 如何选择开源的机器学习框架?
  • Nginx实现动静分离
  • postgresql行列转换函数
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #HarmonyOS:基础语法
  • #nginx配置案例
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $nextTick的使用场景介绍
  • (160)时序收敛--->(10)时序收敛十
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (黑马点评)二、短信登录功能实现
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三) diretfbrc详解
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Windows2003安全设置/维护
  • .htaccess 强制https 单独排除某个目录
  • .mysql secret在哪_MySQL如何使用索引
  • .naturalWidth 和naturalHeight属性,
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net framework profiles /.net framework 配置
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net和php怎么连接,php和apache之间如何连接
  • .NET企业级应用架构设计系列之结尾篇
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @Transient注解