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

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

【题目链接】

ybt 2075:【21CSPJ普及组】插入排序(sort)
洛谷 P7910 [CSP-J 2021] 插入排序

【题目考点】

1. 排序:
  • 插入排序
    插入排序示例:
#include <bits/stdc++.h>
using namespace std;
int main()
{int n, a[100005];cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 2; i <= n; ++i)//将第i个数字插入有序序列{for(int j = i; j > 1; j--)//j指向待插入数字{if(a[j] < a[j - 1])swap(a[j], a[j - 1]);elsebreak;}}for(int i = 1; i <= n; ++i)cout << a[i] << ' ';return 0;
}
  • 索引排序
    设原数组第i元素为a[i],经过排序后的目标数组的第i元素为t[i]
    索引数组ind:ind[i]表示t[i]在数组a中的下标。
    即有目标数组第i元素t[i]a[ind[i]]
    若要交换目标数组中两个元素swap(t[i], t[j]),索引数组的变化为swap(ind[i], ind[j])
    实际上代码中不存在目标数组t,只保存索引数组ind。对索引数组进行排序,可以在不改变原数组a的情况下得到排序后的数组。
    例:插入排序的索引排序
#include <bits/stdc++.h>
using namespace std;
#define N 100005
int main()
{int n, a[N], ind[N];cin >> n;for(int i = 1; i <= n; ++i){cin >> a[i];ind[i] = i;//初始时t[i] == a[i] }for(int i = 2; i <= n; ++i)//将第i个数字插入有序序列for(int j = i; j > 1; j--)//j指向待插入数字{if(a[ind[j]] < a[ind[j - 1]])swap(ind[j], ind[j - 1]);elsebreak;}for(int i = 1; i <= n; ++i)cout << a[ind[i]] << ' ';return 0;
}

【解题思路】

假想存在排序后的目标数组s,设数组sa为索引数组,表示sa[i]排序后下标i的元素s[i]在数组a中的下标。也就是s[i] == a[sa[i]]
设数组as,as[i]表示a[i]在排序后的s数组中的下标,也就是a[i] == s[as[i]]
当i为sa[i]时,有a[sa[i]] == s[as[sa[i]]] == s[i],因此有as[sa[i]] == i
sa与as保存的就是原数组a与目标数组s之间的两个方向的映射关系。

如果s[i]要与s[j]的值发生交换,那么就是从s[i] == a[sa[i]]同时s[j] == a[sa[j]]变为s[i] == a[sa[j]]同时s[j] == a[sa[i]],只需要交换sa[i]sa[j]的值即可。
而后根据as[sa[i]] == i,重新设as[sa[i]]as[sa[j]]的值。因此要完成交换s[i]s[j],需要运行:

void Swap(int i, int j)
{ swap(sa[i], sa[j]);as[sa[i]] = i;as[sa[j]] = j;
}

主函数中,首先输入a数组,初始状态下s数组与a数组相同,满足s[i] == a[i],因此有sa[i] = i; as[i] = i;
先根据题意,使用索引数组完成插入排序,注意交换元素时需要使用我们定义的Swap函数。
而后进行q次操作

  • 如果要改变元素,输入x,v。先将a[x]变为v,而后观察a[x]是变大了还是变小了。

    • 如果满足v > a[x],变大了,则应该把a[x]对应在目标数组中的值s[as[x]]向后移动。
      j从as[x]开始,不断变大,向后遍历s数组,直到j为n-1。
      j向后移动的条件为:当前数字s[j]比后面的数字s[j+1]更大,或者在当前数字s[j]与后面数字s[j+1]相等的情况下,当前数字s[j]在原数组中的下标sa[j]比后面数字s[j+1]在原数组中的下标sa[j+1]更大。因为插入排序是稳定的排序,排序后相等数值元素的相对顺序不变。对于相同的数值,在原数组中下标更大的元素应该排在后面。
      只要满足这一条件,就交换s[j]s[j+1],否则结束循环。该过程中的交换操作要使用我们定义的Swap函数,实际是由索引数组sa与as完成交换。

    • 否则如果满足v <= a[x],变小了,则应该把a[x]对应在目标数组中的值s[as[x]]向前移动。
      j从as[x]开始,不断变小,向前遍历s数组,直到j为2。
      j向前移动的条件为:当前数字s[j]比前面的数字s[j-1]更小,或者在当前数字s[j]与前面数字s[j-1]相等的情况下,当前数字s[j]在原数组中的下标sa[j]比前面数字s[j-1]在原数组中的下标sa[j-1]更小。因为插入排序是稳定的排序,排序后相等数值元素的相对顺序不变。对于相同的数值,在原数组中下标更小的元素应该排在前面。
      只要满足这一条件,就交换s[j]s[j-1],否则结束循环。该过程中的交换操作要使用我们定义的Swap函数,实际是由索引数组sa与as完成交换。

  • 如果要查询原数组第x元素a[x]在s数组中的下标,就是as[x]

【题解代码】

解法1:
#include<bits/stdc++.h>
using namespace std;
#define N 8005
int a[N];
int sa[N];//sa[i]:排序后下标i的元素在数组a中的下标 
int as[N];//as[i]:a[i]在排序后的下标 
void Swap(int i, int j)
{//排序后第i元素第j元素交换 swap(sa[i], sa[j]);as[sa[i]] = i;as[sa[j]] = j;
}
int main()
{int n, q, t, x, v, px;cin >> n >> q; for(int i = 1; i <= n; ++i){cin >> a[i];sa[i] = i;as[i] = i;}for(int i = 1; i <= n; ++i)for(int j = i; j >= 2; --j)if(a[sa[j]] < a[sa[j-1]])Swap(j, j-1);for(int i = 1; i <= q; ++i){//由于插入排序是稳定的,如相等,下标大的在右边 cin >> t;if(t == 1){cin >> x >> v;if(v > a[x])//变大,a[x]右移 {a[x] = v;for(int j = as[x]; j <= n - 1; ++j){if(a[sa[j]] > a[sa[j+1]] || a[sa[j]] == a[sa[j+1]] && sa[j] > sa[j+1])Swap(j, j+1);elsebreak;}}else{//变小,a[x]左移a[x] = v;for(int j = as[x]; j >= 2; --j){if(a[sa[j]] < a[sa[j-1]] || a[sa[j]] == a[sa[j-1]] && sa[j] < sa[j-1])Swap(j, j-1);elsebreak;}}}else{cin >> x;cout << as[x] << endl;}		}return 0;
}

相关文章:

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

【题目链接】 ybt 2075&#xff1a;【21CSPJ普及组】插入排序&#xff08;sort&#xff09; 洛谷 P7910 [CSP-J 2021] 插入排序 【题目考点】 1. 排序&#xff1a; 插入排序 插入排序示例&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int…...

基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

Python第二次作业(2)【控制台界面】

要求&#xff1a;使用Python输出五个控制台界面 第一张&#xff1a; 代码如下&#xff1a; print(" 英雄联盟商城登录界面 ") print("~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") print(" 1.用户登录 &q…...

conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决

conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决 报错信息&#xff1a; Collecting package metadata (current_repodata.json): - ERROR conda.auxlib.logz:stringify(171): Traceback (most recent call last): File “C:\Users\dandelion…...

卤制品配送经营商城小程序的用处是什么

卤制品也是食品领域重要的分支&#xff0c;尤其对年轻人来说&#xff0c;只要干净卫生好吃价格合理&#xff0c;那复购率宣传性自是不用说&#xff0c;而随着互联网发展&#xff0c;传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…...

信息化发展65

1.2现代化基础设施 基础设施包括交通、能源、水利、物流等以传统基础设施和信息网络为核心的新型基础设施&#xff0c;在国家发展全局中具有战略性、基础性、先导性作用。统筹推进传统基础设施和新型基础设施建设&#xff0c;打造系统完备、高效实用、智能绿色、安全可靠的现代…...

pytho实例--pandas读取表格内容

前言&#xff1a;由于运维反馈帮忙计算云主机的费用&#xff0c;特编写此脚本进行运算 如图&#xff0c;有如下excel数据 计算过程中需用到数据库中的数据&#xff0c;故封装了一个读取数据库的类 import MySQLdb from sshtunnel import SSHTunnelForwarderclass SSHMySQL(ob…...

处理飞书在线文档导出Word后无法自动编号问题

处理飞书在线文档导出Word后无法自动编号问题 解题思路&#xff1a;处理效果处理代码测试数据 最近工作中经常编写一些文档&#xff0c;有些文档需要多人协作完成。这两天需要完成一个可研的初稿&#xff0c;同事使用了飞书的在线文档。第一次使用飞书进行文档协作&#xff0c;…...

C++刷题 全排列问题

C刷题 全排列问题 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream>using namespace std;const int maxn 11;//P为当前排列&#xff0c;hashTable记录整数x是否已经在P中 int n, P[maxn], hashTable[maxn] {false};//当前处理排列的第index号…...

求数列a+aa+aaa+aaaa+......前n项和,a和n均由输入获得。

求数列aaaaaaaaaa…前n项和&#xff0c;a和n均由输入获得。 输入格式: 输入两个正整数a和n&#xff0c;两个数之间用逗号分隔。 输出格式: 输出"aaaaaaaaaa…和"的形式&#xff0c;详见输出样例。 输入样例: 在这里给出一组输入。例如&#xff1a; 3,6 输出样例:…...

ElementUI之首页导航+左侧菜单->mockjs,总线

mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中&#xff0c;经常会遇到以下几个尴尬的场景&#xff1a; - 老大&#xff0c;接口文档还没输出&#xff0c;我的好多活干不下去啊&#xff01; - 后端小哥&#xff0c;接口写好了没&#xff0c;我要测试啊&#x…...

文心大模型写TodoList项目需求

大模型写TodoList项目需求 提示词 你是一名资深的互联网软件行业产品经理。 现在要设计一个todo-list项目,它有哪些功能和需求? 分条目写出需求大纲。 文心大模型输出 设计一个Todo-list项目时&#xff0c;需要考虑以下功能和需求&#xff1a; 基本功能&#xff1a; 创建任…...

使用applescript自动化trilium的数学公式环境(二)

9.23 ver1 没想到今天很有精神&#xff0c;在玩chatgpt的时候突然想到&#xff0c;为什么不让他帮我写一份代码呢&#xff1f;说干就干。但是&#xff0c;可能是因为我的英语不怎么样&#xff0c;chatgpt生成出来的整个东西实在是菜的抠脚。所以我觉得还是应该自己先想好一个大…...

机器学习与数据挖掘第三、四周

为什么第二周没有呢……因为刚换老师&#xff0c;自学要适应一段时间。 本课程作者之后的学习目标是&#xff1a;实操代码&#xff0c;至少要将作者参加数学建模中用到的数据处理方法都做一遍。 首先&#xff0c;作者复习一下李宏毅老师的两节课程。 机器学习概述 机器学习就…...

黎明加水印微信小程序源码 支持流量主接入

黎明加水印微信小程序源码&#xff0c;支持流量主接入。支持从聊天记录选择文件、相机拍摄、直接选择文件 支持白底、黑底的隐形水印&#xff0c;制作后&#xff0c;通过增加蒙版方能看到水印 纯前端&#xff0c;可嵌入任何项目。 部署教程 1、解压后得到项目文件夹 3、把…...

22 Python的argparse模块

概述 在上一节&#xff0c;我们介绍了Python的datetime模块&#xff0c;包括&#xff1a;datetime模块中一些常用的属性和函数。在这一节&#xff0c;我们将介绍Python的argparse模块。argparse模块是Python的一个标准库&#xff0c;用于编写命令行界面。它可以处理命令行参数和…...

Unity之NetCode多人网络游戏联机对战教程(3)--NetworkObject组件讲解

文章目录 NetworkObjectAlways Replicate As RootSynchronization TransformActive Scene SynchronizationScene Migration SynchronizationSpawn With ObserversDont Destroy With OwnerAuto Object Parent Sync 后话 NetworkObject 为了复制任何Netcode感知属性或发送/接收R…...

正点原子lwIP学习笔记——Socket接口UDP实验

1. Socket接口UDP连接配置 Socket接口的UDP配置流程如下&#xff1a; sin_family 设置为 AF_INET 表示 IPv4 网络协议&#xff1b;sin_port 为设置端口号&#xff0c; 可设置为 8080&#xff1b;sin_addr.s_addr 设置本地 IP 地址&#xff1b;调用函数 Socket 创建 Socket 连…...

连接组学中的机器学习:从表征学习到模型拟合

前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势&#xff0c;在医学影像领域取得了巨大的成功。由于具备这些优势&#xff0c;机器学习已被广泛应用于神经成像数据&#xff0c;目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…...

数据结构-----二叉树的创建和遍历

目录 前言 二叉树的链式存储结构 二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 二叉树的创建 创建一个新节点的函数接口 1.创建二叉树返回根节点 2.已有根节点&#xff0c;创建二叉树 3.已有数据&#xff0c;创建二叉树 前言 在此之前我们学习了二叉树的定义和储…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...