插入排序(sort)C++

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

插入排序是一种非常常见且简单的排序算法。小ZZZ是一名大一的新生,今天HHH老师刚刚在上课的时候讲了插入排序算法。
假设比较两个元素的时间为O(1)O(1)O(1),则插入排序可以以O(n2)O(n^2)O(n2)的时间复杂度完成长度为n 的数组的排序。不妨假设这nnn个数字分别存储在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;

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

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

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

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

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

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

sort.zip

输入描述:

 

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

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

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

输出描述:

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

示例1

输入

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

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

输出

1 1 2

1
1
2

说明

 

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

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

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

备注:

 

对于所有测试数据,满足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。对于所有测试数据,保证在所有QQQ次操作中,至多有 500050005000 次操作属于类型一。

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

 暴力:

修改操作O(1)   查询O(n)  最大查询次数为2×10^5次,每次复杂度为O(n),最大为8000,最坏复杂度就是1.6×10^9  TLE 

被查询的数的位置 = 比他小的数 + 在他左边和他 一样大的数 + 1

例如 3 1 2 2 == >1 2 2 3  

代码:

#include <iostream>
#include <cstdio>

using namespace std;

typedef long long ll;

const int N = 8010;

ll n,q;
ll k,k1,k2;
ll cnt1,cnt2;
ll a[N];

int main() {
    cin >> n >> q;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    while(q--) {
        cnt1 = 0,cnt2 = 0;
        scanf("%lld",&k);
        if (k == 1) {
            scanf("%lld %lld",&k1,&k2);
            a[k1]=k2;//修改
        }else {
            scanf("%lld",&k1);
            for(int i=1;i<k1;i++)
            {
                if(a[i]==a[k1]) cnt1++;
                if(a[i]<a[k1]) cnt2++;
            }
            for(int i=k1+1;i<=n;i++)
            {
                if(a[i]<a[k1]) cnt2++;
            }
            printf("%lld\n",cnt1+cnt2+1);
        }
    }
    
    return 0;
}

优化:因为处理的次数不超过5000,我们可以做一个预处理,每次查询直接输出O(1),每次修改的时候去遍历维护我们的预处理数组O(n)

最坏复杂度大概是8000×8000(预处理)+5000×8000(修改)+(200000-5000)*1 大约是 1e8的复杂度

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 8010;

int n,q;
int k,k1,k2;
int cnt1,cnt2;
int a[N];
int left1[N],all1[N];

void cc(int k1, int k2) {
    int cntt = 0,cntts = 0;//cntt 和修改点相等的 cntts 小于修改点的
    for (int i = 1;i < k1;i++) {
        if (a[i] == k2) cntt++;
        if (a[i] < k2) cntts++;
        if(a[i] > a[k1]) all1[i]--;
        if(a[i] > k2) all1[i]++;
    }
    left1[k1] = cntt;
    
    for (int i =k1+1;i <= n;i++) {
        if (a[i] == a[k1]) left1[i]--;
        if (a[i] == k2) left1[i]++;
        if (a[i] > a[k1]) all1[i]--;
        if (a[i] > k2) all1[i]++;
        if (a[i] < k2) cntts++;    
    }
    a[k1] = k2;
    all1[k1] = cntts;
    
}

int main() {
    cin >> n >> q;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    
    for (int i = 1;i <= n;i++) {
        cnt1 = 0,cnt2 = 0;
        for (int j = 1;j <= n;j++) {
            if (a[j] == a[i]) cnt1++;
            if (i-j==1) left1[i]=cnt1;
            if(a[j]<a[i]) cnt2++;
        }
        all1[i] = cnt2;
    }
    while(q--) {
        cnt1 = 0,cnt2 = 0;
        scanf("%d",&k);
        if (k == 1) {
            scanf("%d %d",&k1,&k2);
            cc(k1,k2);
        }else {
            scanf("%d",&k1);
            printf("%d\n",left1[k1]+all1[k1]+1);
        }
    }
    
    return 0;
}

当一个点发生变化的时候
1.这个点的两个属性都会发生改变
2.这个点左右所有的点(比其小)这个属性会发生改变
3.这个点右边的点(左边和其相等这个属性)会发生改变

而这些属性的改变只要一个循环就能全部求出

只要每个点都遍历一遍
减去修改前点的影响再加上新点的影响即可

因此修改的复杂度是O(n);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2:脚手架 vue-cli

Vue2&#xff1a;脚手架 vue-cli 结构renderrefpropsmixinscoped 脚手架是Vue官方提供的Vue开发平台&#xff0c;.vue文件就需要通过脚手架来解析&#xff0c;所以对于单文件组件就依赖于脚手架。 安装&#xff1a; npm i -g vue/cli如果执行vue --version有输出&#xff0c;…

【MYSQL】主从复制机制(图解)

一、什么是主从复制 主从复制是一种通过binlog&#xff08;二进制日志&#xff09;进行操作的一直复制机制&#xff0c;它会有一个主数据库&#xff0c;还会有一个从数据库&#xff0c;根据binlog就可以把主数据库中的信息复制到从数据库之中。这个主从复制的好处就是如果在并发…

SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性

介绍 Spring Cloud Gateway 根据请求的路径、HTTP 方法、头部等信息&#xff0c;将请求路由到对应的微服务实例。它支持基于动态路由规则的配置&#xff0c;可以根据请求的 URL、查询参数、请求头等条件&#xff0c;灵活地决定将请求转发到哪个微服务。Spring Cloud Gateway 提…

Java学习Day60:回家!(ElasticStatic)

1.what is ElasticStatic The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elaticsearch&#xff0c;简称…

《进制转换:数字世界的奇妙变身术》

思维导图 一、什么是进制转换 在当今数字化飞速发展的时代&#xff0c;数字如同构建整个数字宇宙的基本粒子&#xff0c;无处不在且发挥着至关重要的作用。而在这个数字的魔法世界里&#xff0c;进制就像是不同的语言规则&#xff0c;每种进制都有着独特的构建方式和逻辑。 我…

Unity3D高级编程

1、标签(Tag)和图层(Layer) 他们都用于游戏物体分类&#xff0c;但是侧重点不一样。 标签便于代码中对特定物体进行操作。 图层则服务于渲染和碰撞管理&#xff0c;如控制摄像机渲染、光源影响及碰撞设置。 标签和图层的位置&#xff1a; &#xff08;1&#xff09;标签Tag…

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

IDEA最新最全设置教程(包括常用的插件)

一、目的 统一安装一些必要的插件,方便大家开发。统一代码格式、注释格式、统一字符集编码。新加入的同事可以快速适应和熟悉,不需要在讲解IDEA配置问题。二、IDEA要修改的设置 新项目设置和设置 1. Java编译版本 这里请使用自己的JDK 2. 统一IDEA字符集 统一使用UTF-8 无…

日本IT工作好找吗?

在日本做IT是否好找工作&#xff0c;实际上取决于多个因素&#xff0c;包括个人的技术能力、日语水平、工作经验以及市场需求等。以下是对这一问题的详细分析&#xff1a; 技术能力与日语水平 技术能力&#xff1a;IT行业是一个技术密集型行业&#xff0c;技术能力自然是求职…

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布&#xff1a;系统支持社团发布活动信息、招募新成员等&#xff0c;方便社团进行线上线下活动的组织和管理。 增强凝聚力&#xff1a;通过系统&#xff0c;社团成员可以更好地交流和互动&#xff0c;增强社团的凝聚力和影响力。 生活服务功能 二手市场…

用 Python 从零开始创建神经网络(六):优化(Optimization)介绍

优化&#xff08;Optimization&#xff09;介绍 引言 引言 在随机初始化的模型中&#xff0c;或者即使是采用更复杂方法初始化的模型中&#xff0c;我们的目标是随着时间的推移培训或教育一个模型。为了训练一个模型&#xff0c;我们调整权重和偏差以提高模型的准确性和置信度…

架构篇(04理解架构的演进)

目录 学习前言 一、架构演进 1. 初始阶段的网站架构 2. 应用服务和数据服务分离 3. 使用缓存改善网站性能 4. 使用应用服务器集群改善网站的并发处理能力 5. 数据库读写分离 6. 使用反向代理和CDN加上网站相应 7. 使用分布式文件系统和分布式数据库系统 8. 使用NoSQL和…

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…

【网络安全】公钥基础设施

1. PKI 定义 1.1 公钥基础设施的概念 公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;是一种基于公钥密码学的系统&#xff0c;它提供了一套完整的解决方案&#xff0c;用于管理和保护通过互联网传输的信息。PKI的核心功能包括密钥管理、…

【计算机网络】UDP网络程序

一、服务端 1.udpServer.hpp 此文件负责实现一个udp服务器 #pragma once#include <iostream> #include <string> #include <cstdlib> #include <cstring> #include <functional> #include <strings.h> #include <unistd.h> #incl…

定时器简介

TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能&#xff0c;也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序…

【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing

HITS: High-coverage LLM-based Unit Test Generation via Method Slicing 1. 来源出处 本文是发表在2024年39th IEEE/ACM International Conference on Automated Software Engineering (ASE)上的论文。作者包括Zejun Wang, Kaiibo Liu, Ge Li和Zhi Jin,他们来自北京的PKU …

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…