P7910[CSP-J2021]插入排序

news2024/11/14 12:00:48
 题目描述

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

    假设比较两个元素的时间为O(1),则插入排序可以以 O(n^2)的时间复杂度完成长度为 n 的数组的排序。不妨假设这 n 个数字分别存储在 a1, a2, …,an 之中,则如下伪代码给出了插入排序算法的一种最简单的实现方式:

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

这下面是 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的数组 a,数组下标从1 开始,并且数组中的所有元素均为非负整数。小 Z 需要支持在数组 a上的 Q次操作,操作共两种,参数分别如下:

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

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

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

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

输入

第一行,包含两个正整数 n, Q,表示数组长度和操作次数。

第二行,包含 n 个空格分隔的非负整数,其中第 i 个非负整数表示 ai。

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

输出

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

样例输入
3 4
3 2 1
2 3
1 3 2
2 2
2 3
样例输出
1
1
2
提示

【样例解释 #1】

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

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

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

【样例 #2】

见附件中的 sort/sort2.in 与 sort/sort2.ans

该测试点数据范围同测试点 1∼2。

【样例 #3】

见附件中的 sort/sort3.in 与 sort/sort3.ans

该测试点数据范围同测试点3∼7。

【样例 #4】

见附件中的 sort/sort4.in 与 sort/sort4.ans

该测试点数据范围同测试点12∼14。

【数据范围】

对于所有测试数据,满足1≤n≤8000,1≤Q≤2×105,1≤x≤n,1≤v,ai≤10^9。

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

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

测试点n ≤Q≤特殊性质
1∼41010
5∼9300300
10∼1315001500
14∼1680008000保证所有输入的ai,v 互不相同
17∼1980008000
20∼2280002×10^5保证所有输入的ai,v 互不相同
23∼2580002×10^5
 思路

这题很坑,压根不是插入排序,插入排序只能得52分……,需要一个位置数组,每修改一个数,就进行单点冒泡排序

代码
#include <bits/stdc++.h>
using namespace std;
int n,q,x,v,cz,t[8010];
struct shu
{
	int num,yuan;//数值,原来的位置 
}a[8010];
bool comp(shu x,shu y)
{
	if(x.num!=y.num)//先比值再比位置 
	{
		return x.num<y.num;
	}
	return x.yuan<y.yuan;
}
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].num;
		a[i].yuan=i;
	}
	sort(a+1,a+1+n,comp);//预处理排序 
	for(int i=1;i<=n;i++)
	{
		t[a[i].yuan]=i;//位置数组 
	}
	for(int i=1;i<=q;i++)
	{
		cin>>cz;
		int b=0;
		if(cz==1)
		{
			cin>>x>>v;
			a[t[x]].num=v;//更改值 
			//单点冒泡及时排序 
			for(int j=t[x];j>=2;j--)//向前 
			{
				if(a[j].num<a[j-1].num)
				{
					swap(a[j],a[j-1]);
				}
				else 
				{
					if(a[j].num==a[j-1].num)//如果一样大就看位置的先后 
					{
						if(a[j].yuan<a[j-1].yuan)
						{
							swap(a[j],a[j-1]);
						}
					}
				}
			}
			for(int j=t[x];j<=n-1;j++)//向后 
			{
				if(a[j].num>a[j+1].num)
				{
					swap(a[j],a[j+1]);
				}
				else 
				{
					if(a[j].num==a[j+1].num)
					{
						if(a[j].yuan>a[j+1].yuan)
						{
							swap(a[j],a[j+1]);
						}
					}
				}
			}
			for(int j=1;j<=n;j++)//交换完立刻维护位置数组 
			{
				t[a[j].yuan]=j;
			}			
		}
		else
		{
			cin>>x;
			cout<<t[x]<<endl;
		}
	}
	return 0;
}

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

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

相关文章

win11找环境变量

第一步&#xff1a;win&#xff0b;i 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步&#xff1a;

从屎山代码到RTOS,老工程师的架构进化史

很多老铁和我反馈&#xff0c;说很喜欢看我写的内容&#xff0c;不管是朋友圈还是文章&#xff0c;能在字里行间&#xff0c;受益匪浅。 想想也很久没时间没写长文了&#xff0c;既然大家喜欢看&#xff0c;我尽量抽时间多写。 长文预警&#xff0c;全文5800多字&#xff0c;…

云动态摘要 2024-08-28

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费领用]电商出海AIGC福利包活动 腾讯云 2024-08-20 腾讯云智能助力中小电商企业用户出海&#xff0c;帮助企业用户轻松打造全场景AIGC应用。 注册阿里云免费领云服务器_云服务器ECS_阿…

【达梦数据库】表空间重命名新建用户下的模式

目录 背景需求解决方法 背景 达梦数据库中&#xff0c;一个用户对应一个表空间&#xff0c;用户会创建默认模式0。 在使用过程中&#xff0c;客户需要新建模式1&#xff0c;并且模式1和原来的表空间对应。 需求 1、表空间如何重命名 2、如何新建用户下的模式1 解决方法 表…

Linux设备树初步

一.设备树的概念 设备树&#xff1a;是一种描述硬件资源的数据结构&#xff0c;不是将设备的每个细节都硬编码到操作系统中&#xff0c;而是可以在引导时传递给操作系统的数据结构中描述硬件的许多方面。 设备树是描述一个硬件平台的硬件资源。这个“设备树”可以被bootloade…

综合能源充电站有序充电策略

随着电动汽车的发展&#xff0c;充电用户越来越多&#xff0c;同时也出现了一系列问题&#xff0c;尤其是无序充电带来的充电成本高、充电排队时间长和电网负荷安全影响等问题&#xff0c;制约着电动汽车和充电设施的发展。为解决此类问题&#xff0c;文章研究和设计有序充电策…

Kevin‘s notes about Qt---Episode 4 多次点击按钮反复执行机械臂动作

原先版本 SDK 1.2.1 - 2020-04-02 HMI 界面 4.0.6.135135 控制器 1.7.5 升级程序 0.6.4 伺服版本 不详(似乎也并不重要) 前言 在之前的工作中,这个问题并没有得到有效解决,情况如下: 在之前版本的程序中,每次动作执行完后需要关闭Qt界面,下一次想要运行机械臂程序时,…

数据链路层(Mac帧,报头字段,局域网通信原理),MTU,MSS,ip报文的分包与组装(ip报头字段介绍,组装过程,判断是否被分片/收到全部分片)

目录 数据链路层 介绍 MTU 介绍 在哪一层分片 IP报文的分包与组装 16位标识 3位标志 13位片偏移 示例 组装过程 确定是否被分片 确定是否收到全部分片 注意点 数据链路层与网络层的关系 Mac帧 Mac地址 报头格式 目的/源地址 类型 局域网通信原理 图解 碰撞…

TCP并发服务端的实现

思想&#xff1a;创建多个套接字&#xff0c;由"我"来管理这些套接字 方法&#xff1a; 1.多进程 2.多线程 3.IO多路复用 tcp服务器端创建流程&#xff1a; socket() bind() listen() connfd accept IO多路复用&#xff1a; 多个文件I复用同一个进程 IO…

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…

【香橙派系列教程】(十八) 视觉垃圾桶-网络线程

【十八】视觉垃圾桶-网络线程 文章目录 【十八】视觉垃圾桶-网络线程一、增加网络控制功能1.实现需求&#xff1a;2.TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。三、C语言实现TCP KeepAlive功能1.函数原型2.返回…

Python+tkinter实现俄罗斯方块游戏

游戏界面&#xff1a; 一个方块区域&#xff08;游戏板&#xff09;&#xff0c;显示当前分数和最高分的标签&#xff0c;以及控制按钮&#xff08;重启、暂停、显示排行榜&#xff09;。玩家可以通过点击“Restart”按钮重启游戏&#xff0c;点击“Pause”按钮暂停游戏&#…

Windows隐藏起你的秘密文件以及文件夹工具

我们都知道&#xff0c;在 Windows 中可以右键文件夹&#xff0c;选择”属性“&#xff0c;勾选”隐藏“来实现隐藏某个文件夹。 我们还知道&#xff0c;在 Windows 中可以选择勾选 ”显示隐藏的项目和文件夹“&#xff0c;来使上述方法变得形同虚设。 本工具就是用于解决以上…

Spring框架:开发者的得力伙伴,魅力何在?

目录 一. Spring介绍 二. Spring搭建 三. Spring Bean管理 ▐ 管理方式 ▐ 依赖注入 四. Spring数据访问层管理 五. Spring集成MyBatis 海漫浩浩,我亦苦作舟!大家一起学习,一起进步! 一. Spring介绍 Spring是什么? Spring 是一个轻量级的, IOC 和 AOP 的一站式 J…

刷机维修进阶教程-----小米系列机型手机端 直接修改参数步骤解析

在前面分享的修改机型参数的博文中都是开启端口。然后使用电脑端工具类 进行修改参数。今天来给大家解析下小米系列机型如何直接在手机端上面进行修改。在这里要切记。操作前需要备份原机的各项基带参数 分区以及基带qcn。避免操作失误无信号无基带故障出现。 通过博文可以初…

产业园的运营到底有多重要?

在当今经济高速发展的时代&#xff0c;产业园如雨后春笋般涌现&#xff0c;成为推动产业升级和区域经济发展的重要力量&#xff0c;然而&#xff0c;一个成功的产业园并非仅仅依靠开发建设就能实现其价值&#xff0c;更需要精心的运营管理。为什么这么说&#xff1f;今天我们就…

RSA加密解密算法认识及signln_resolve

RSA初步了解 一、首先认识rsa是一种非对称加密算法。 对称加密&#xff1a;加密解密使用同一个密钥&#xff0c;加密者接受信息采用密钥加密&#xff0c;而到破译者手中还是使用这份密钥。这种方式的优点是加密效率高、加解密速度快&#xff0c;但是缺点是密钥需要共享&#x…

如何评价快手可灵的图生视频能力,和市场同类产品相比孰优孰劣?

利用AI工具批量生成影视短剧推广https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为可灵AI官方认证为数不多的几十名超级创作者之一&#xff0c;同时也是AI视频生成多种应用的深度使用者&#xff0c;我来回答下这个问题。 我认为快手可灵是目前市场上无可争议&#xff0c;顶级的图…

python方法介绍

python基础语法 前言导读:Python的创始⼈人为吉多范罗苏姆(Guido van Rossum)。 1989年年的圣诞节期间,吉多范罗苏姆为了了在阿姆斯特丹打发时间,决⼼开发一个新的脚本解释程序,作为ABC语言的一种继承。其诞生于1990年; 1. 基础常识 1.1 python的发展 1989年,Guido (…

Python青少年简明教程:流程控制语句

Python青少年简明教程&#xff1a;流程控制语句 流程控制是编程语言中用于控制程序执行顺序的机制。它决定了代码块的执行路径&#xff0c;包括哪些语句会被执行、哪些不会被执行以及在什么条件下执行。 本节介绍Python的流程控制语句。 if语句 if语句简单的语法格式如下&…