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

题目描述

插入排序是一种非常常见且简单的排序算法。王同学是一名大一的新生,今天许师哥刚刚在上课的时候讲了插入排序算法。

假设比较两个元素的时间为 O\left ( 1 \right ),则插入排序可以以 O\left ( n^2 \right ) 的时间复杂度完成长度为 n� 的数组的排序。不妨假设这 n 个数字分别存储在a_1,a_2,......,a_n​ 之中,则如下伪代码给出了插入排序算法的一种最简单的实现方式:
下面是插入排序的示范代码:


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;}


为了帮助王同学更好的理解插入排序,许师哥给他留下了这么一道课后作业:

许师哥给了一个长度为 n 的数组 a,数组下标从 1 开始,并且数组中的所有元素均为非负整数。王同学需要支持在数组 a 上的 Q 次操作,操作共两种,参数分别如下:
1 x v:这是第一种操作,会将 a 的第 x 个元素,也就是 a_x​ 的值,修改为 v。保证 1 \leq x \leq n, 1 \leq v \leq 10 ^9注意这种操作会改变数组的元素,修改得到的数组会被保留,也会影响后续的操作
 

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

许师哥不喜欢过多的修改,所以他保证类型 11 的操作次数不超过 50005000。

输入描述

第一行,包含两个正整数 n,Q\left ( 1 \leq n \leq 8000,1 \leq Q \leq 2 \times 10^5 \right ),表示数组长度和操作次数。
第二行,包含 n 个空格分隔的非负整数,其中第 i 个非负整数表示 a_i \left ( 1 \leq a _i \leq 10^9 \right )
接下来 Q 行,每行 2∼3个正整数,表示一次操作,操作格式见【题目描述】
输入数据保证 1 \leq x \leq n, 1 \leq v \leq 10 ^9,同时,在所有 Q 次操作中,至多有 5000 次操作属于类型一。

输出描述

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

样例

输入:

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

输出:

1
1
2

输入:

10 10
877332633 234569527 229171089 600324455 1458624 887548760 574229391 234569527 202374341 849045846
2 7
1 2 234569527
1 4 600324455
2 6
2 9
2 6
2 3
1 5 246345024
1 6 856960762
2 7

输出:

6
10
2
10
3
6

思路:

题目告诉我们至多5000次修改,很明显修改次数少,查询次数多。所以我们不能在查询时间进行排序操作的修改,但是可以在修改时间进行操作。
我们可以先对数据进行排序,原结构体数组记录排好序的下表,将排序结构体中对应好原数组的位置。
修改时间操作的理论:我将原来的数和修改后的数之间的下表进行修改,大于和小于这两个数的下表不需要修改,因为重新排序也不影响这两个数之外的位置,所以只需要修改原数和修改数区间内的下表即可。这样就可以可使用O(n)的时间复杂度完成这一操作
查询时间的理论:在修改时间同时维护这这两个结构体数组之间的对应关系,所以查询的时间复杂度是O(1)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 8100;
struct node1
{int value,pxb;
}a[N];//原数组,对应的是该位置的值,该位置排序后的下标
struct node2
{int vlaue,yxb;
}b[N];//排序数组,对应的是该位置的值,该位置在原数组中对应的下标
bool cmp(node2 x,node2 y){if(x.vlaue == y.vlaue)return x.yxb < y.yxb;return x.vlaue < y.vlaue;
}int main()
{ios::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);int n,q;cin >> n >> q;for(int i = 1;i <= n;i++){int x;cin >> x;b[i].vlaue = x;b[i].yxb = i;}sort(b+1,b+1+n,cmp);// for(int i = 1;i <= n;i++){//     cout << b[i].vlaue << endl;// }for(int i = 1;i <= n;i++){a[b[i].yxb].value = b[i].vlaue;a[b[i].yxb].pxb = i;}// for(int i = 1;i <= n;i++){//     cout << a[i].pxb << " " << a[i].value << endl;// }while(q--){int op;cin >> op;if(op == 1){int x,v;cin >> x >> v;int yu = a[x].value;int xi = v;a[x].value = v;b[a[x].pxb].vlaue = v;int i = a[x].pxb;//两个循环只会进入一个//这个循环时说修改后的值比原来的值小了,用排序的数组往前找他自己的位置while(i != 1 &&( b[i].vlaue < b[i - 1].vlaue || (b[i].vlaue == b[i - 1].vlaue && b[i].yxb < b[i-1].yxb))){swap(b[i],b[i - 1]);a[b[i].yxb].pxb=i;a[b[i].yxb].value=b[i].vlaue;a[b[i - 1].yxb].pxb=i - 1;a[b[i - 1].yxb].value=b[i - 1].vlaue;i--;}//这个循环,修改后的值比原来的值大了,用排序数组往后找他自己的位置while(i != n &&( b[i].vlaue > b[i + 1].vlaue || (b[i].vlaue == b[i + 1].vlaue && b[i].yxb > b[i+1].yxb))){swap(b[i],b[i + 1]);//交换之后需要维护原来的对应关系a[b[i].yxb].pxb=i;a[b[i].yxb].value=b[i].vlaue;a[b[i + 1].yxb].pxb=i + 1;a[b[i + 1].yxb].value=b[i + 1].vlaue;i++;}}if(op == 2){int x;cin >> x;cout << a[x].pxb << "\n";}}
}

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

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

相关文章

如何在PADS Logic中查找器件

PADS Logic提供类似于Windows的查找功能&#xff0c;可以进行器件的查找。 &#xff08;1&#xff09;在Logic设计界面中&#xff0c;将菜单显示中的“选择工具栏”进行打开&#xff0c;如图1所示&#xff0c;会弹出对应的“选择工具栏”的分栏菜单选项&#xff0c;如图2所示。…

IDE /字符串 /字符编码与文本文件(如cpp源代码文件)

文章目录 概述文本编辑器如何识别文件的编码格式优先推测使用了UTF-8编码&#xff1f;字符编码的BOM字节序标记重分析各文本编辑器下的测试效果Qt Creator的文本编辑器系统记事本VS的文本编辑器Notepad 编译器与代码文件的字符编码ANSI编码其他 概述 前期在整理 《IDE/VS项目属…

大数据存储架构详解:数据仓库、数据集市、数据湖、数据网格、湖仓一体

前言 本文隶属于专栏《大数据理论体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据理论体系 思维导图 数据仓库 数据仓库是一个面向主题的&…

如何提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与…

酷开科技以内容为核心打造OTT大屏营销投放新体系

如何打造“因地制宜”的营销策略&#xff0c;围绕内容场景&#xff0c;搭建更具效能的OTT大屏营销投放体系&#xff1f;是一个值得思考的问题。 酷开科技OTT大屏营销&#xff0c; 以营销内容为核心、通过更加立体化的沟通模式&#xff0c;创新性整合和打通多元资源&#xff0c…

数据结构--图的存储邻接表法

数据结构–图的存储邻接表法 邻接矩阵&#xff1a; 数组实现的顺序存储&#xff0c;空间复杂度高&#xff0c;不适合存储稀疏图 邻接表&#xff1a; 顺序链式存储 邻接表法&#xff08;顺序链式存储&#xff09; //边/弧 typedef struct ArcNode {int adjvex; //边/弧指向哪个…

echarts 单数据,平滑曲线柱状图显示

var myChart echarts.init(document.getElementById(main)); let namelist [23/01, 23/02, 23/03, 23/04, 23/05, 23/06, YTD] let planList [10.9, 22.6, 15.6, 14.4, 12.0, 12.3, 14.6] let target 14 // 指定图表的配置项和数据 var option { tooltip: { },//提示语 xA…

wampserver的mysql8.0版本在my.ini文件中加入skip_grant_tables无效等一系列问题。

背景&#xff1a;安装了新的wampserver之后&#xff0c;php版本mysql8.0.31&#xff0c;想打开phpadmin可视化管理页面&#xff0c;后来忘记密码了&#xff0c;报错&#xff1a;ERROR 1045 (28000): Access denied for user rootlocalhost (using password: No)&#xff0c;只能…

Linux搭建SVN环境(最新版)

最新版本号(svn-1.14) https://opensource.wandisco.com/centos/7 更新版本库 sudo tee /etc/yum.repos.d/wandisco-svn.repo <<-EOF [WandiscoSVN] nameWandisco SVN Repo baseurlhttp://opensource.wandisco.com/centos/$releasever/svn-1.14/RPMS/$basearch/ enabled…

Django中使用反向关系名称(related_name)解决由“多对多”关系引起的字段名字冲突问题引起的迁移命令报错。

当在模型中为关系字段添加了related_name参数后&#xff0c;您可以使用该参数指定的名称来引用反向关系。下面是一个简单的例子来说明如何引用反向关系。 假设您有以下两个模型&#xff1a; from django.db import modelsclass Author(models.Model):name models.CharField(…

Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解

文章目录 0.前言1. 原理详解1.1. 哨兵机制的组建1.1. 哨兵是如何知道从库的信息 1.2. 主库下线的判定1.3. 哨兵集群选举1.4. 故障的转移 2. 总结3. Redis从入门到精通系列文章4. Redis哨兵模式面试题4. 1. 什么是Redis的哨兵模式&#xff1f;4. 2. 哨兵模式的优点是什么&#x…

CCF真题练习:202209-1如此编码

题目背景 某次测验后&#xff0c;顿顿老师在黑板上留下了一串数字 23333 便飘然而去。凝望着这个神秘数字&#xff0c;小 P 同学不禁陷入了沉思…… 题目描述 已知某次测验包含 n 道单项选择题&#xff0c;其中第 i 题&#xff08;1≤i≤n&#xff09;有 个选项&#xff0c;…

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用&#xff0c;这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的&#xff0c;在上一篇的时候提到测试了一下&#xff0c;从PC1去访问PC4的时候&#xff0c;只从E0/0/2发送给了E0/0/3这是&#xff0c;因为两个接…

gogs的自定义配置

在 GOGS 下载并安装后&#xff0c;在程序目录下建立一个custom/conf/app.ini的配置文件&#xff0c;内容如下&#xff1a; APP_NAME Gogs # APP名字 RUN_USER git # 启动用户&#xff0c;设置后只能以此账号启动gogs RUN_MODE prod[database] DB_TYPE mysql HOST 1…

PHP特性之CTF中常见的PHP绕过

目录 一、关于md5()和sha1()的常见绕过 1、使用数组绕过 2、 使用特殊字符串绕过 二、strcmp绕过 三、switch绕过 四、intval绕过 一、关于md5()和sha1()的常见绕过 知识介绍&#xff1a; 1、对于php强比较和弱比较&#xff1a;md5()&#xff0c;sha1()函数无法处理数组…

使用3DS Max 创建未来派螺栓枪模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 步骤 1 创建一个框并将其转换为可编辑多边形&#xff08;右键单击>转换为&#xff1a;>转换为可编辑多边形&#xff09;&#xff0c;然后使用连接添加一系列边循环&#xff0c;如下图所示。 步骤 2 …

基于JavaSpringBoot+Vue+uniapp微信小程序实现鲜花商城购物系统

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

⚡【C语言趣味教程】(3) 浮点类型:单精度浮点数 | 双精度浮点型 | IEEE754 标准 | 介绍雷神之锤 III 源码中的平方根倒数速算法 | 浮点数类型的表达方式

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

文件IO_文件截断_ftruncate,truncate(附Linux-5.15.10内核源码分析)

目录 1.为什么需要文件截断&#xff1f; 2.truncate函数介绍 2.1 truncate函数 2.2 truncate函数内核源码分析 2.3 truncate函数使用示例 3.ftruncate函数介绍 3.1 ftruncate函数 3.2 ftruncate函数内核源码分析 3.3 ftruncate函数使用示例 3.4 ftruncate和文件偏移量…

进程间通信之共享内存

共享内存 1.共享内存的概念2.共享内存函数2.1 shmget函数2.2 shmat函数2.3 shmdt函数2.4 shmctl函数 3. 共享内存的使用 1.进程间通信的分类&#xff1a; &#xff08;1&#xff09;管道&#xff1a;1、匿名管道pipe;2、命名管道mkfifo &#xff08;2&#xff09;System V IPC&…