当前位置: 首页 > 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;创建二叉树 前言 在此之前我们学习了二叉树的定义和储…...

听说读写画样样精通!美团开源LongCat-Next,给物理世界AI统一了语言

美团刚刚开源了最强原生多模态模型LongCat-Next&#xff0c;将物理世界AI的语言统一了。LongCat-Next模型能听&#xff0c;能说。比如语音问答&#xff0c;或者让它用指定音色说话&#xff0c;能读能写&#xff08;视觉理解和推理&#xff09;&#xff0c;还能画画和设计&#…...

设备维护日历可视化:用低代码平台打造智能保养提醒看板(含模板下载)

设备维护日历可视化&#xff1a;用低代码平台打造智能保养提醒看板 在制造业的日常运营中&#xff0c;设备维护保养常常被视为"必要但繁琐"的后台工作。传统的手工记录或Excel表格管理方式&#xff0c;不仅效率低下&#xff0c;还容易因人为疏忽导致关键保养任务被遗…...

三步突破语音克隆音质瓶颈:VoxCPM ZipEnhancer全解析

三步突破语音克隆音质瓶颈&#xff1a;VoxCPM ZipEnhancer全解析 【免费下载链接】VoxCPM VoxCPM: Tokenizer-Free TTS for Context-Aware Speech Generation and True-to-Life Voice Cloning 项目地址: https://gitcode.com/GitHub_Trending/vo/VoxCPM 在语音合成领域&…...

SSDTTime实战指南:从入门到精通的ACPI补丁工具应用

SSDTTime实战指南&#xff1a;从入门到精通的ACPI补丁工具应用 【免费下载链接】SSDTTime SSDT/DSDT hotpatch attempts. 项目地址: https://gitcode.com/gh_mirrors/ss/SSDTTime ACPI补丁工具SSDTTime是一款跨平台的开源解决方案&#xff0c;专为简化硬件兼容性补丁创建…...

基于springboot的论坛网站设计与实现.7z(源码+论文+开题报告)

[点击下载链接》》》] 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了论坛网站的开发全过程。通过分析论坛网站管理的不足&#xff0c;创建了一个计算机管理论坛网站的方案。文章介绍了论坛网站的系统分析部分&…...

告别虚拟机!在物理机统信系统上部署FME Desktop的性能调优与存储空间规划指南

告别虚拟机&#xff01;在物理机统信系统上部署FME Desktop的性能调优与存储空间规划指南 当GIS工程师需要在国产化环境中处理大规模空间数据时&#xff0c;物理机直接部署FME Desktop往往能获得比虚拟机更极致的性能表现。本文将深入探讨在统信UOS专业版物理机环境中&#xff…...

罗技鼠标宏压枪脚本终极指南:3步实现绝地求生精准射击

罗技鼠标宏压枪脚本终极指南&#xff1a;3步实现绝地求生精准射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中枪口乱跳而烦…...

字节跳动的Trae的使用感受,及对比腾讯小龙虾使用场景

一、Trae的使用 Trae支持多种模型&#xff0c;官网下载安装后&#xff0c;直接在对话框描述你的需求&#xff0c; 比如&#xff0c;我这里需求是帮我按照ui设计图&#xff0c;帮我生成小程序页面&#xff1a; A. 上传磨刀或蓝狐页面设计图&#xff0c;例如&#xff1a;蓝湖选中…...

远程收款好用服务商

在数字化支付日益普及的今天&#xff0c;远程收款成为许多商家和创业者的重要需求。然而&#xff0c;由于各种风控限制&#xff0c;微信支付、支付宝等主流支付平台在异地收款时常常出现异常提示或风险拦截&#xff0c;给用户带来了不少困扰。本文将对比分析几家提供远程收款服…...

别再乱设target_frame了!深度解读ROS2 pointcloud_to_laserscan源码,搞懂tf转换与消息过滤器的正确用法

别再乱设target_frame了&#xff01;深度解读ROS2 pointcloud_to_laserscan源码&#xff0c;搞懂tf转换与消息过滤器的正确用法 在机器人感知系统中&#xff0c;将三维点云数据转换为二维激光扫描数据是常见的降维处理手段。ROS2的pointcloud_to_laserscan功能包看似简单&…...