插入排序(sort)C++

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

插入排序是一种非常常见且简单的排序算法。小ZZZ是一名大一的新生,今天HHH老师刚刚在上课的时候讲了插入排序算法。
假设比较两个元素的时间为O(1)O(1)O(1),则插入排序可以以O(n2)O(n^2)O(n2)的时间复杂度完成长度为n 的数组的排序。不妨假设这nnn个数字分别存储在a1,a2,⋅⋅⋅,ana_1, a_2, · · · , a_na1​,a2​,⋅⋅⋅,an​之中,则如下伪代码给出了插入排序算法的一种最简单的实现方式:

这下面是C/C++ 的示范代码

for (int i = 1; i <= n; i++)for (int j = i; j>=2; j‐‐)if ( a[j] < a[j‐1] ){int t = a[j‐1];a[j‐1] = a[j];a[j] = t;}

这下面是Pascal 的示范代码

for i:=1 to n dofor j:=i downto 2 doif a[j]<a[j‐1] thenbegint:=a[i];a[i]:=a[j];a[j]:=t;end;

为了帮助小 ZZZ 更好的理解插入排序,小 ZZZ的老师 HHH老师留下了这么一道家庭作业:

HHH老师给了一个长度为nnn的数组aaa,数组下标从111开始,并且数组中的所有元素均为非负整数。小 ZZZ 需要支持在数组aaa上的QQQ次操作,操作共两种,参数分别如下:

111 xvx vxv: 这是第一种操作,会将aaa的第xxx个元素,也就是axa_xax​的值,修改为vvv。保证1≤x≤n,1≤v≤1091≤x≤n,1≤v≤10^91≤x≤n,1≤v≤109。 注意这种操作会改变数组的元素, 修改得到的数组会被保留, 也会影响后续的操作。

222 xxx: 这是第二种操作,假设 H 老师按照上面的伪代码对aaa数组进行排序,你需要告诉 HHH老师原来aaa的第xxx个元素,也就是axa_xax​,在排序后的新数组所处的位置。保证1≤x≤n1≤x≤n1≤x≤n。 注意这种操作不会改变数组的元素, 排序后的数组不会被保留, 也不会影响后续的操作 。

HHH老师不喜欢过多的修改,所以他保证类型111的操作次数不超过500050005000。

小ZZZ没有学过计算机竞赛,因此小 ZZZ 并不会做这道题。他找到了你来帮助他解决这个问题。

sort.zip

输入描述:

 

输入的第一行包含两个正整数n,Qn, Qn,Q,表示数组长度和操作次数。保证1≤n≤8,000,1≤Q≤2×1051≤n≤8,000,1≤Q≤2×10^51≤n≤8,000,1≤Q≤2×105。

输入的第二行包含nnn个空格分隔的非负整数,其中第iii个非负整数表示aia_iai​。保证1≤ai≤1091≤a_i≤10^91≤ai​≤109。

接下来QQQ行,每行2∼32∼32∼3个正整数,表示一次操作,操作格式见题目描述。

输出描述:

对于每一次类型为222的询问,输出一行一个正整数表示答案。

示例1

输入

3 4 3 2 1 2 3 1 3 2 2 2 2 3

3 4
3 2 1
2 3
1 3 2
2 2
2 3

输出

1 1 2

1
1
2

说明

 

在修改操作之前,假设HHH老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是3,2,13,2,13,2,1。

在修改操作之前,假设 HHH老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是3,1,23,1,23,1,2。

注意虽然此时a2=a3a_2 =a_3a2​=a3​,但是我们不能将其视为相同的元素。

备注:

 

对于所有测试数据,满足1≤n≤8,000,1≤Q≤2×105,1≤x≤n,1≤v,ai≤1091≤n≤8,000,1≤Q≤2×10^5,1≤x≤n,1≤v,a_i≤10^91≤n≤8,000,1≤Q≤2×105,1≤x≤n,1≤v,ai​≤109。对于所有测试数据,保证在所有QQQ次操作中,至多有 500050005000 次操作属于类型一。

各测试点的附加限制及分值如下表所示。

 暴力:

修改操作O(1)   查询O(n)  最大查询次数为2×10^5次,每次复杂度为O(n),最大为8000,最坏复杂度就是1.6×10^9  TLE 

被查询的数的位置 = 比他小的数 + 在他左边和他 一样大的数 + 1

例如 3 1 2 2 == >1 2 2 3  

代码:

#include <iostream>
#include <cstdio>using namespace std;typedef long long ll;const int N = 8010;ll n,q;
ll k,k1,k2;
ll cnt1,cnt2;
ll a[N];int main() {cin >> n >> q;for(int i=1;i<=n;i++) scanf("%lld",&a[i]);while(q--) {cnt1 = 0,cnt2 = 0;scanf("%lld",&k);if (k == 1) {scanf("%lld %lld",&k1,&k2);a[k1]=k2;//修改}else {scanf("%lld",&k1);for(int i=1;i<k1;i++){if(a[i]==a[k1]) cnt1++;if(a[i]<a[k1]) cnt2++;}for(int i=k1+1;i<=n;i++){if(a[i]<a[k1]) cnt2++;}printf("%lld\n",cnt1+cnt2+1);}}return 0;
}

优化:因为处理的次数不超过5000,我们可以做一个预处理,每次查询直接输出O(1),每次修改的时候去遍历维护我们的预处理数组O(n)

最坏复杂度大概是8000×8000(预处理)+5000×8000(修改)+(200000-5000)*1 大约是 1e8的复杂度

#include <iostream>
#include <cstdio>using namespace std;const int N = 8010;int n,q;
int k,k1,k2;
int cnt1,cnt2;
int a[N];
int left1[N],all1[N];void cc(int k1, int k2) {int cntt = 0,cntts = 0;//cntt 和修改点相等的 cntts 小于修改点的for (int i = 1;i < k1;i++) {if (a[i] == k2) cntt++;if (a[i] < k2) cntts++;if(a[i] > a[k1]) all1[i]--;if(a[i] > k2) all1[i]++;}left1[k1] = cntt;for (int i =k1+1;i <= n;i++) {if (a[i] == a[k1]) left1[i]--;if (a[i] == k2) left1[i]++;if (a[i] > a[k1]) all1[i]--;if (a[i] > k2) all1[i]++;if (a[i] < k2) cntts++;    }a[k1] = k2;all1[k1] = cntts;}int main() {cin >> n >> q;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i = 1;i <= n;i++) {cnt1 = 0,cnt2 = 0;for (int j = 1;j <= n;j++) {if (a[j] == a[i]) cnt1++;if (i-j==1) left1[i]=cnt1;if(a[j]<a[i]) cnt2++;}all1[i] = cnt2;}while(q--) {cnt1 = 0,cnt2 = 0;scanf("%d",&k);if (k == 1) {scanf("%d %d",&k1,&k2);cc(k1,k2);}else {scanf("%d",&k1);printf("%d\n",left1[k1]+all1[k1]+1);}}return 0;
}

当一个点发生变化的时候
1.这个点的两个属性都会发生改变
2.这个点左右所有的点(比其小)这个属性会发生改变
3.这个点右边的点(左边和其相等这个属性)会发生改变

而这些属性的改变只要一个循环就能全部求出

只要每个点都遍历一遍
减去修改前点的影响再加上新点的影响即可

因此修改的复杂度是O(n);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15768.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

卷积、频域乘积和矩阵向量乘积三种形式之间的等价关系与转换

线性移不变系统 线性移不变系统&#xff08;Linear Time-Invariant System, LTI系统&#xff09;同时满足线性和时不变性两个条件。 线性&#xff1a;如果输入信号的加权和通过系统后&#xff0c;输出是这些输入信号单独通过系统后的输出的相同加权和&#xff0c;那么该系统就…

15分钟学 Go 第 53 天 :社区资源与学习材料

第53天&#xff1a;社区资源与学习材料 目标 了解Go语言官方资源掌握社区重要学习平台学会利用开源项目学习构建个人知识体系 一、Go语言官方资源汇总 资源类型网址说明Go官网golang.org官方文档、下载、教程Go Blogblog.golang.org技术博客、最新特性介绍Go Playgroundpla…

「QT」文件类 之 QIODevice 输入输出设备类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

timescale使用例子 - 纽约出租车

一、资料使用 在timescale的官方网站的“教程”菜单中&#xff0c;有几个不同业务场景的例子&#xff0c;其中就有运输行业的例子。我访问中文站点的时候&#xff0c;关于教程的几个步骤内容刷不出来&#xff0c;所以还是建议访问英文站点。 https://docs.timescale.com/tuto…

树(二叉查找树、平衡二叉树、红黑树)

树&#xff08;二叉树、二叉查找树、平衡二叉树、红黑树&#xff09; 二叉查找树&#xff08;二叉排序树、二叉搜索树&#xff09;添加元素查找元素遍历弊端 平衡二叉树旋转机制&#xff1a;左旋旋转机制&#xff1a;右旋需要旋转的四种情况1. 左左&#xff1a;一次右旋2. 左右…

医疗器械包装运输试验之抗压试验的条件选取及方法和设备的要求

医疗器械包装运输试验之抗压试验的试验目的&#xff1a; 抗压试验通常用来评估产品在承受外界压力时&#xff0c;包装对内装物样品的保护能力。试验通常模拟产品在运输流通过程中可能遇到的压力环境。通过试验&#xff0c;可以验证包装对内装物的保护能力、包装结构的完整性、…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

数据结构-二叉树

一.二叉树的定义 二叉树有左右儿子之分 完美二叉树&#xff08;满二叉树&#xff09;除了最下面的没有儿子其他结点都有两个儿子&#xff0c;叶节点比较齐的&#xff0c;完全二叉树不是满二叉数允许缺失最后的结点 满二叉树可以达到2^k-1 边的总数节点数-1 二.二叉树的存储结构…

OKR制定指南

Goal Crafting 目标制定是最基本的领导活动之一。组织绩效和团队成长依赖于精心制定的目标。没有良好的目标制定练习&#xff0c;团队可能只关注眼前的事务&#xff0c;解决看似可以快速解决的问题。良好的目标制定迫使你不忽视或推迟那些需要新思维方式、合作或克服困难的问题…

详细分析Java中FilterChain过滤器的基本知识

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习&#xff1a; 常用在一些重复代…

TableGPT2-7B:用于表格数据分析的大规模解码器模型

TableGPT2-7B 是浙江大学开发的最先进的大规模解码器模型&#xff0c;专为涉及表格数据的数据密集型任务而设计。该模型以 Qwen2.5 架构为基础&#xff0c;包括针对表格数据的专用编码&#xff0c;其中独特的语义编码器可从行、列和整个表格中获取洞察力。 主要特点和功能 Ta…

SQL面试题——抖音SQL面试题 主播播出时长

主播播出时长 现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间: 每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长? 通过上面的数据,可以清晰的看出,同一个批次…

数字信号处理Python示例(14)生成锯齿波和三角波

文章目录 前言一、锯齿波和三角波二、生成锯齿波和三角波的Python代码三、仿真结果及分析写在后面的话 前言 因其独特的数学特性和物理表现&#xff0c;在工程和技术领域扮演着重要角色。这是生成非正弦信号的几个Python示例的其中一个&#xff0c;生成三角波与锯齿波&#xf…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…

前端快速上手(一):HTML

目录 1. HTML 基础 1.1 HTML 标签 1.2 标签的结构关系 2. HTML 常见标签 2.1 标题标签: h1 - h6 2.2 段落标签: p 2.3 换行标签: br 2.4 图片标签: img 2.5 超链接: a 标签 2.5.1 外部链接 2.5.2 内部链接 2.5.3 文件资源链接 2.5.4 空链接 2.6 表格标签 2.7 表单…

QT<30> Qt中使鼠标变为转圈忙状态

前言&#xff1a;当我们在写软件时&#xff0c;在等待阻塞耗时操作时可以将鼠标变为忙状态&#xff0c;并在一段时间后恢复状态&#xff0c;可以用到GxtWaitCursor&#xff1a;Qt下基于RAII的鼠标等待光标类。 一、效果演示 二、详细代码 在项目中添加C文件&#xff0c;命名为…

Shell环境导致编译失败处理方法

在嵌入式Linux系统源码&#xff08;BSP包&#xff09;编译时&#xff0c;有可能会如现如下提示&#xff1a; [[: not found 这种提示&#xff0c;一般是Shell环境为dash而不是bash导致&#xff0c;可以通过如下命令来切换&#xff1a; sudo dpkg-reconfigure dash 执行后会…

nginx openresty lua-resty-http 使用的一些问题记录

需求背景 需求是使用 nginx 做一个 https 服务的代理 nginx 收到 http 请求后&#xff0c;需要修改 body 中的某些参数值&#xff0c;然后将修改后的数据发送到目标服务器&#xff08;https&#xff09; 本来以为很简单的需求&#xff0c;结果中间出现了不少岔子&#xff0c;这…

Redis的分布式锁分析

系列文章目录 Java项目对接redis&#xff0c;客户端是选Redisson、Lettuce还是Jedis&#xff1f; 由Redis引发的分布式锁探讨 系列文章目录一、什么是分布式锁&#xff1f;二、Redis分布式锁的几种实现1. 简单分布式锁2. Redlock 三、Redis 锁的问题1. 互斥失效2. 时钟偏移 四…

柯桥生活英语口语学习“面坨了”英语怎么表达?

“面坨了”英语怎么表达&#xff1f; 要想搞清楚这个表达&#xff0c;首先&#xff0c;我们要搞明白“坨”是啥意思&#xff1f; 所谓“坨”就是指&#xff0c;面条在汤里泡太久&#xff0c;从而变涨&#xff0c;黏糊凝固在一起的状态。 有一个词汇&#xff0c;很适合用来表达这…