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

这篇具有很好参考价值的文章主要介绍了曲师大2023大一新生排位赛-B.Sort题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

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

假设比较两个元素的时间为 ,则插入排序可以以  的时间复杂度完成长度为 n� 的数组的排序。不妨假设这 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 个元素,也就是 ​ 的值,修改为 v。保证 。注意这种操作会改变数组的元素,修改得到的数组会被保留,也会影响后续的操作
 

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

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

输入描述

第一行,包含两个正整数 ,表示数组长度和操作次数。
第二行,包含 n 个空格分隔的非负整数,其中第 i 个非负整数表示 。
接下来 Q 行,每行 2∼3个正整数,表示一次操作,操作格式见【题目描述】
输入数据保证 ,同时,在所有 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)

代码:文章来源地址https://www.toymoban.com/news/detail-585670.html

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

到了这里,关于曲师大2023大一新生排位赛-B.Sort题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GDOU-CTF-2023新生赛Pwn题解与反思

    因为昨天学校那边要进行天梯模拟赛,所以被拉过去了。 16点30分结束,就跑回来宿舍开始写。 第一题和第二题一下子getshell,不用30分钟,可能我没想那么多,对比网上的WP,自己和他们有点不太一样,比较暴力。 大概17点10的时候,写第三题,可能自己第一次遇到随机数问

    2023年04月17日
    浏览(59)
  • 激斗云计算:互联网大厂打响新一轮排位战

    大模型如同一辆时代列车,所有科技大厂都想上车。 自去年底ChatGPT一炮而红,国内外数十家科技大厂、创业公司、机构相继下场,一时间掀起大模型的热浪。 《中国人工智能大模型地图研究报告》显示,截至今年5月28日,中国10亿参数规模以上的大模型已发布79个,中美两国

    2024年02月16日
    浏览(47)
  • 人工智能讲师大模型培训老师叶梓:基于大型语言模型的自主智能体:架构设计与应用前景

    在人工智能的快速发展中,大型语言模型(LLM)已成为推动技术进步的关键力量。LLM的出现不仅改变了我们与机器的交互方式,也为构建具有高级认知能力的自主智能体(AI Agent)提供了新的可能性。本文旨在探讨基于LLM的AI Agent的架构设计,并对其在未来应用中的潜力进行展

    2024年04月17日
    浏览(59)
  • 人工智能讲师AI讲师大模型讲师叶梓介绍及大语言模型技术原理与实践提纲

    叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的建设工作,开展行业数据的智能化应用研发工作,

    2024年02月22日
    浏览(58)
  • 大一python题库及答案,大一python期末必考题

    大家好,小编来为大家解答以下问题,大一python填空题题库,大一python期末简答题,今天让我们一起来看看吧! 一、Python语言的简述 Python语言是一种解释型、面向对象的编程语言,是一种开源语言。 Python属于动态类定义语言,也是一种强调类型语言。 二、Python语言的特点

    2024年02月08日
    浏览(43)
  • 大一python上机题库及答案,大一python选择题库答案

    大家好,小编为大家解答大一python上机题库及答案的问题。很多人还不知道大一python选择题库答案,现在让我们一起来看看吧! 大家好,小编来为大家解答以下问题,大一python编程题库和答案山东理工大学,大一python编程题库和答案解析,今天让我们一起来看看吧! 单项选

    2024年02月03日
    浏览(65)
  • 大一python语言程序设计,大一pta编程题python答案

    大家好,小编为大家解答大一python语言程序设计的问题。很多人还不知道大一pta编程题python答案,现在让我们一起来看看吧! 实例001:数字组合 题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析 遍历全部可能,把有重复的剃

    2024年03月22日
    浏览(84)
  • 大一作业习题

    第一题: 答案: 第二题: 答案: 第三题: 答案:

    2024年02月05日
    浏览(42)
  • C++大一基础知识

    目录 一、程序控制 ①输入输出 Ⅰ.cincout Ⅱ.scanfprintf ②运算与符号 Ⅰ常用数学函数#include Ⅱ.数据类型转换 ③控制结构 ④函数 Ⅰ.函数定义 Ⅱ函数使用 二、数据结构 ①一维数组 排序与查找 ②多维数组 ③指针 Ⅰ字符,指针运算 Ⅱ字符串函数#include Ⅲ指针参数与动态内存

    2024年02月09日
    浏览(58)
  • 大一Python期末复习笔记

    目录 前言 一,输出格式控制 ①多行输出 ②不换行输出 ③精度保留和对齐 Ⅰ.format Ⅱ.f\\\'{}\\\' Ⅲ.% 二,嵌套 ①嵌套循环 Ⅰ.for          Ⅱ.while ②嵌套列表,字典 三,列表与字符串 ①添加元素 ②切片访问与逆序,join ③count,find,index ④删除与替换 list str 四,函数 ①lambda ②复

    2023年04月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包