【NOIP2021普及组复赛】题2:插入排序(sort)

【信息学奥赛一本通】2075:【21CSPJ普及组】插入排序(sort) 2075:【21CSPJ普及组】插入排序(sort) 阅读详情

题2:插入排序(sort)

【题目描述】

插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。

假设比较两个元素的时间为 O(1)O(1)O(1),则插入排序可以以 O(n2)O(n^2)O(n2) 的时间复杂度完成长度为 n 的数组的排序。不妨假设这 n 个数字分别存储在 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 do
          for j:=i downto 2 do
               if a[j]<a[j‐1] then
                    begin
                           t:=a[i];
                           a[i]:=a[j];
                           a[j]:=t;
                   end;

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

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

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

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

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

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

【输入文件】

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

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

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

【输出文件】

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

【输入样例1】

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

【输出样例1】

1
1
2

【样例1说明】

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

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

【输入输出样例2-4】

见选手目录下的 sort/sort2.in 与 sort/sort2.ans

见选手目录下的 sort/sort3.in 与 sort/sort3.ans

见选手目录下的 sort/sort4.in 与 sort/sort4.ans

【数据规模】

对于所有测试数据,满足 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。

对于所有测试数据,保证在所有 Q 次操作中,至多有 5000 次操作属于类型一。

【代码如下】:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=8005;
int n,q;
int t[MAXN];
struct node{
	int pre,id;
}a[MAXN];
bool cmp(node x,node y){
	if(x.pre!=y.pre) return x.pre<y.pre;
	return x.id<y.id;
}
int main(){
	scanf("%d%d",&n,&q); 
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i].pre);
		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
		t[a[i].id]=i;
	for(int i=1;i<=q;i++){
		int opt,x,v;
		scanf("%d",&opt);
		if(opt==1){
			scanf("%d%d",&x,&v);
			a[t[x]].pre=v;
			for(int j=n;j>=2;j--)
				if(cmp(a[j],a[j-1])){
					node kkksc03=a[j];
					a[j]=a[j-1];
					a[j-1]=kkksc03;
				}
			for(int j=2;j<=n;j++)
				if(cmp(a[j],a[j-1])){
					node kkksc03=a[j];
					a[j]=a[j-1];
					a[j-1]=kkksc03;
				}
			for(int i=1;i<=n;i++)
				t[a[i].id]=i;
		}
		else{
			scanf("%d",&x);
			printf("%d\n",t[x]);
		}
	}
	return 0;
}
【21CSPJ普及组】插入排序(sort) 76分和100分,终于一雪考试的时候没改文件命令的耻了…… 阅读详情

相关推荐

[CSP-J 2021] 插入排序

小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。在修改操作之前,假设 H 老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是。在修改操作之后,假设 H 老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是。因为修改时只改动一个元素的值,所以可以遍历一遍数组,用冒泡法找到合适的位置.修改复杂度降为。他找到了你来帮助他解决这个问题。H 老师不喜欢过多的修改,所以他保证类型。H 老师不喜欢过多的修改,所以他保证类型。,在排序后的新数组所处的位置。

hhhh 1595

2075:【21CSPJ普及组】插入排序(sort)(三种做法,层层优化)

2075:【21CSPJ普及组】插入排序(sort)(三种做法,层层优化)

weq2011的博客 1854

CSP-J 2021普及组题解T2:插入排序

朴素版(50分) #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 10010; //p[i]表示排序后i位置的数在原数组p[i]位置 //np[i]表示原数组i位置的数在排序后的数组np[i] int a[N], b[N], p[N], np[N], bp[N], bnp[N]; int n, q; int main() {

少儿编程乔老师 5768

排序算法(3)插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 3.1 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,...

cowbin2012的专栏 1万+

数据结构与算法之插入排序

前言 相信大家已经在算法的道路上正一步一个脚印,突破自我。今天依然带领大家一起探讨一下简单的排序算法——插入排序。下一篇会更新插入排序的优化,持续跟着小编学习算法。 插入排序 题目描述: 给定一个无序数组,按照从小到大的顺序进行排序。 例如: int[] arr = {7, 6, 5, 4, 3, 2, 1, 0}; 返回一个有序的数组:sortArray:{0, 1, 2, 3, 4, 5, 6, 7} 实现思想 如下图所示: 图解思路: 1、首先,给定一个无序数组,[7, 6.

xue_mall的博客 649

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 436

信息学奥赛 NOIP/CSP 字符串排序题 4 种解法与考点分析

本文深入解析信息学奥赛 NOIP/CSP 中字符串排序题的4种解法与核心考点,包括string类+STL sort、二维字符数组+选择排序、指针数组+冒泡排序和索引数组+插入排序。通过对比分析各解法的性能、适用场景及易错点,帮助竞赛选手掌握字符串排序的最优策略,提升解题效率与得分能力。

weixin_34122810的博客 425

基于gem5模拟trace的cache模拟器的实现

在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trac

gaoxiang的专栏 8891

排序算法在信息学竞赛中的高效应用:从理论到实践

本文深入探讨了排序算法在信息学竞赛(如NOIP、NOI)中的高效应用,从理论分析到实战技巧全面解析。针对不同数据规模推荐最优算法,提供性能优化关键技巧和实战案例,帮助竞赛选手在极端环境下提升解题效率。特别强调快速排序、归并排序等O(nlogn)算法在大数据量场景的核心价值。

lg888的博客 780

ali140滑块

ali 140滑块采用补环境的方式进行逆向,需要的文件主要为这两个,其中collina.js是最主要的环境校验和参数加密的逻辑,这两个文件放本地进行补环境。然后挂上代理,先保证能够正常运行代码,补了些许后能够正常运行了,我们打印最主要的加密函数看看:n值就是得到:挂上代理看看鼠标事件,不管加密逻辑,关心入参即可:收集一些鼠标事件传进记录的函数。其余就是处理一些环境值,一些resetSA的逻辑就行。截图记录:

bboysteed的博客 1676

【硬件开发】振铃

如果是开关管的振铃,那么桥臂的SW处产生的振铃会窜入驱动电路,造成的结果就是驱动电路和上桥臂下桥臂之间的SW节点都会有振铃现象。如果是驱动电路的振铃,那么MCU的输出引脚还是正常的PWM,但是到了MOS管两侧就变成带有振铃的PWM波形了。开关振铃产生的原因是MOS管上面的寄生电感当开关管打开时为了保持电流不变感应出的电压会对电源和地产生冲击。开关管的驱动线上的寄生电容和寄生电感导致的振铃为驱动电路振铃。开关管上的寄生电容和寄生电感导致的振铃为开关节点振铃。、电感等元件的存在,导致电路中的电压和。

weixin_62546664的博客 1822

刷题(3)-排序(2)

目录 2. 归并排序 (稳定) 3.冒泡排序(稳定) 4.选择排序 5.插入排序 (稳定) 6. 希尔排序 7. 堆排序 8. 桶排序(不基于比较,稳定) 8.1 计数排序 8.2.基数排序(稳定) 2. 归并排序 (稳定) 复杂度: 时间O(NlogN) 空间O(N) 保证稳定性。 思想:首先考虑一个数组 【first,mid】 【mid+1,last】都排好序了...

speargod的博客 750

手写Socket Web服务器:深入HTTP协议底层原理

HTTP协议是Web通信的基石,其本质是一套严格定义的文本格式与状态交互规范。理解它需回归传输层——TCP连接建立、请求响应格式(如状态行、头/体分隔符\r\n\r\n)、字符编码与字节长度一致性等核心原理。这些知识直接决定CORS拦截、中文乱码、Content-Length错误等高频问题的排查效率。在现代框架封装日益厚重的今天,亲手用Socket实现一个可被Chrome识别的极简Web服务器,成为掌握Web运行机制最有效的实践路径。本文即以DebugLZQ经典案例为蓝本,还原从URI解析、DNS查询、So

weixin_40192258的博客 534

插入排序 CSP-J2021

题目来源:https://www.luogu.com.cn/problem/P7910(洛谷) 建议到洛谷查看题目(下面的题目描述比较乱,作者比较懒,没整理) 题目描述 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为\mathcal O(1)O(1),则插入排序可以以\mathcal O(n^2)O(n2)的时间复杂度完成长度为nn的数组的排序。不妨假设这nn个数字分别存储在a_1, a_2...

whd_wanghaoda的博客 3765

ITIL-IT运维管理-概述

ITIL-IT运维管理-概述 概述 IT服务管理(ITSM)是一套帮助企业对IT系统的规划、研发、实施和运营进行有效管理的方法,是一套方法论。ITSM起源于ITIL(IT Infrastructure Library,IT基础架构标准库),ITIL是CCTA(英国国家电脑局)于1980年开发的一套IT服务管理标准库。它把英国在IT管理方面的方法归纳起来,变成规范,为企业的IT部门提供一套从计划、研发、实施到运维的标准方法。 中文名 IT服务管理 外文名 ITService Management 专家

syjhct的博客 4万+

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5540

信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序

对于相同的数值,在原数组中下标更大的元素应该排在后面。对于相同的数值,在原数组中下标更小的元素应该排在前面。先根据题意,使用索引数组完成插入排序,注意交换元素时需要使用我们定义的。sa与as保存的就是原数组a与目标数组s之间的两个方向的映射关系。主函数中,首先输入a数组,初始状态下s数组与a数组相同,满足。假想存在排序后的目标数组s,设数组sa为索引数组,表示。开始,不断变大,向后遍历s数组,直到j为n-1。开始,不断变小,向前遍历s数组,直到j为2。在排序后的s数组中的下标,也就是。

君义NOIP的博客 2309

OpenClaw进阶实战(五):多模态能力扩展——让OpenClaw看懂图片、听懂语音

本文介绍了如何在OpenClaw中实现多模态能力,包括图像文字识别(OCR)、图像描述和语音识别(ASR)三种技能。通过PaddleOCR、BLIP和Whisper等开源工具,可以本地化部署这些功能,保护数据隐私。文章详细展示了三个独立技能模块的实现代码,并提出了一个"多模态智能管家"方案,能自动识别消息类型(文本/图片/语音)并调用相应处理技能。该方案适用于电商客服、会议纪要等真实业务场景,使AI助手具备"眼睛"和"耳朵"的多模态交互能力。

PeterPan的博客 160

P7910 [CSP-J 2021] 插入排序

题目描述 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n2)的时间复杂度完成长度为n的数组的排序。不妨假设这n个数字分别存储在 a1​,a2​,…,an​之中,则如下伪代码给出了插入排序算法的一种最简单的实现方式: 这下面是 C/C++ 的示范代码:

m0_75129175的博客 842

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

排序算法之插入排序

希望我的文章能对你学习插入排序有所帮助!

ZhangYu_010228的博客 857

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

插入排序

插入排序是一种常见且很简单的排序方法。现在有下面一组数据需要进行排序,如下图所示: 下面的动态图解释了插入排序是如何运作的: 插入排序是这么运作的: 1. 取44(索引i=1)和i之前的数进行比较,由于3 2. 取索引i=2处的38,将38和它之前的所有数依次进行比较:因为38 3不需要交换,索引加1:i=3 3. 取索引i=3处的5,将5和它之前的所有数依次进行比较

iFuMI的博客 747

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

第八章 排序

转自:https://www.cnblogs.com/onepixel/articles/7674659.html 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序...

huashaoyoumanre的博客 400

(六)简单排序—插入排序

 一、插入排序思想:将位置为1(即下标为1)的元素取出复制到temp的临时变量,然后将它与位置1之前(当然这里只有0)的元素进行比较,如果temp中的值比位置0的值大,则直接将temp复制到位置1。如果它比位置0的值小,则将位置0的值向右移动一位,然后将temp复制到位置0。这样前两位元素就局部有序了。接下来,取出位置2上的元素复制到temp临时变量,将它与2之前的两个元素进行比较,如

AI布道师W 1070

曲师大2023大一新生排位赛-B.Sort题解

修改时间操作的理论:我将原来的数和修改后的数之间的下表进行修改,大于和小于这两个数的下表不需要修改,因为重新排序也不影响这两个数之外的位置,所以只需要修改原数和修改数区间内的下表即可。许师哥给了一个长度为 n 的数组 a,数组下标从 1 开始,并且数组中的所有元素均为非负整数。查询时间的理论:在修改时间同时维护这这两个结构体数组之间的对应关系,所以查询的时间复杂度是O(1)许师哥不喜欢过多的修改,所以他保证类型 11 的操作次数不超过 50005000。的时间复杂度完成长度为 n� 的数组的排序。

qq_62899367的博客 910

常见的排序算法——插入排序

3.插入排序 (1)基本思想: 插入排序是将n个待排元素的序列看成两个表,分别为有序表和无序表。起初,有序表中只有一个元素,即下标为0的元素;无序表中含有 n-1个元素,即下标从1到n-1的元素。排序过程就是每次将无序表中的第一个元素拿出,然后依次与有序表中的元素进行比较,找到合适的位置,将其插入,直到无序表中没有元素。 (2)插入排序示意图: 图解过程: a.共进行 arr.length-1 轮的排序(因为是从下标为1的元素开始作为无序表的) b.从无序表中拿第一个元素 c.在有序表中找

weixin_53754024的博客 1101

信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体、计数排序

假设比较两个元素的时间为 O(1),则插入排序可以以 O(n^2) 的时间复杂度完成长度为 n 的数组的排序。对 a 数组进行排序,你需要告诉 H 老师原来 a 的第 x 个元素,也就是 ax,在排序后的新数组所处的位置。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。在修改操作之后,假设 H 老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是 3,1,2。对于所有测试数据,满足 1≤n≤8000,1≤Q≤2×10^5,1≤x≤n,1≤v, ai≤10^9。

ya888g 1375
上一篇: 【NOIP2021普及组复赛】题1:分糖果(candy)
下一篇: 【NOIP2021普及组复赛】题3:网络连接(network)
lpstudio
博客等级 码龄16年 1266粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lpstudio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值