插入排序(CSP-J 2021 T2)
题目:(由于题干过长直接上链接:P7910 [CSP-J 2021] 插入排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)) 不是打广告
又有一个新思路:
我们可以再开一个b数组用来记录第i个数排序后的位置并在更改数据(操作一)后维护b数组,使b数组依然适用。

同时还要开一个struct s(用于记录a数组)记录id(输入顺序)和va(输入内容)。
因为要根据输入数据初始化b数组,需要把a数组 sort一遍。因为s是结构体就要自定义cmp,(重点来了!)因为我们要模拟稳定排序所以自定义cmp中除了正常操作(return a.va<b.va;)还有一点,如果在cmp中两个输入的值相等时还要比较这两个值的输入顺序(即id值),id值小的排在前面,大的排在后面。
通过遍历一遍a数组将b[a[i].id]设为i(意为第a[i].id个数在排序后在i的位置)来初始化b数组。

根据输入判断是哪一种操作
如果是第一种操作,就是改变a数组,更新b数组。
在a数组中如果替换的数值比原来大就要向右边做一次冒泡,把它放到合适的位置。(如果它不交换了就break掉,能节省不少时间)如果替换的数值比原来的小就向左做冒泡……(强调:如果值一样还要比较id值)
在第一种操作结束之前,我们还要再更新一遍b数组(初始化b数组遍历一遍a数组将b[a[i].id]设为i)。
如果是第二种操作,十分简单输入x,输出b[x]即可(别问我为什么,看了那么多还不明白就重看吧!)。
代码:
#include<bits/stdc++.h>
using namespace std;
struct s{
int id;
int va;
}a[8010];
int n,q,b[8010]={0};
int cmp(const s &a,const s &b)
{
if(a.va!=b.va) return a.va<b.va;
else return a.id<b.id;
}
int main()
{
#ifdef LOCAL
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
#endif
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i].va;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
b[a[i].id]=i;
}
while(q--)
{
int t;
scanf("%d",&t);
if(t==1)
{
int x,v;
scanf("%d%d",&x,&v);
if(a[b[x]].va<v)
{
a[b[x]].va=v;
for(int i=b[x];i<n;i++)
{
if(a[i].va>a[i+1].va||(a[i].va==a[i+1].va&&a[i].id>a[i+1].id)) swap(a[i],a[i+1]);
else break;
}
}
else
{
a[b[x]].va=v;
for(int i=b[x]-1;i>=1;i--)
{
if(a[i].va>a[i+1].va||(a[i].va==a[i+1].va&&a[i].id>a[i+1].id)) swap(a[i],a[i+1]);
else break;
}
}
for(int i=1;i<=n;i++)
{
b[a[i].id]=i;
}
}
else
{
int x;
scanf("%d",&x);
printf("%d\n",b[x]);
}
}
return 0;
}
最后,祝大家暑假快乐!

插入排序(CSP-J 2021 T2)的更多相关文章
- CSP J/S 初赛总结
CSP J/S 初赛总结 2021/9/19 19:29 用官方答案估计 J 涂卡的时候唯一的一支 2B 铅笔坏了,只能用笔芯一个个涂 选择 \(-6\ pts\) 判断 \(-3\ pts\) 回答 ...
- 【游记】CSP J/S 2019 游记
J 组 \(2:30\)开始, \(2:13\)还在酒店的我看了看手表...飞奔考场. T1 数字游戏 秒切. 下午某中学某大佬说可用线性基(%) T2 公交换乘 用单调队列思想,秒切. T3 纪念品 ...
- CSP J/S 2019受虐记
一枚蒟蒻的游记~ 提高组DAY1 不是说每场考试都有一道签到题吗 那我tm读了三遍题硬是没找到一道水题是怎么回事(是我太弱了吗) 没办法,硬着头皮做T1 暴力写法...期望得分30pts 于是...在 ...
- [游记]2020/CSP - S总结
2020 / C S P − S 总 结 2020/CSP - S总结 2020/CSP−S总结 这年的 C S P CSP CSP考的不是很理想,本来稳进的 C S P − J CSP-J CSP− ...
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- 算法笔记_010:插入排序(Java)
1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...
- 【PyQt】插入排序算法
# coding=utf-8 import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class MainWindow(QMai ...
- 2021年第十二届蓝桥杯javaA组省赛部分题目
试题 D: 路径 本题总分:10 分 [问题描述] 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径. 小蓝的图由 2021 个结点组成,依次编号 1 至 2021. 对 ...
- 冒泡排序最佳情况的时间复杂度,为什么是O(n)
冒泡排序最佳情况的时间复杂度,为什么是O(n) 我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第 ...
- Python 数据结构和算法
阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...
随机推荐
- java学习之SpringMVC
0x00前言 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet. Spring MVC 是结构最清晰的 Servlet+ ...
- ValidList
package com.dlzb.enterprising.config; import javax.validation.Valid; import java.util.*; public clas ...
- Oracle中新建数据表的两种方法
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- GAC简述
GAC简介 GAC全称是Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data.System.Windows.Forms等等. ...
- .NET周报【11月第2期 2022-11-15】
国内文章 统一的开发平台.NET 7正式发布 https://www.cnblogs.com/shanyou/archive/2022/11/09/16871945.html 在 2020 年规划的. ...
- 读 RocketMQ 源码,学习并发编程三大神器
笔者是 RocketMQ 的忠实粉丝,在阅读源码的过程中,学习到了很多编程技巧. 这篇文章,笔者结合 RocketMQ 源码,分享并发编程三大神器的相关知识点. 1 CountDownLatch 实现 ...
- 【zookeeper】Zookeeper相关概念、重难点(myid)、语法、使用、工具
1234567890 1请按照我是想额度插入fvtgb6yhn7ujm8ik,9ol.
- 【Java SE】Day07 API、Scanner类、Random类、ArrayList类
一.API 1.概述: API(Application Programming Interface),应用程序编程接口 Java API:程序员的字典,是类的说明文档 2.使用步骤 帮助文档:JDK_ ...
- 【Hadoop学习】中:HDFS、shell操作、客户端API操作、数据流、1NN、2NN原理、DataNode配置
一.概述 1.背景.定义.使用场景(一次写入.不支持修改) 2.优(容错)缺点(延迟.不支持小文件.不支持修改) 3.组成架构 NameNode:Master,管理命名空间.配置策略 DataNode ...
- 彻底理解Python中的闭包和装饰器(上)
什么是闭包 闭包(Closure)其实并不是Python独有的特性,很多语言都有对闭包的支持.(当然,因为Python是笔者除C/C++之外学习的第二门语言,所以也是第一次遇到闭包.)简而言之,闭包实 ...