插入排序(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内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...
随机推荐
- Ansible执⾏速度优化
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 优化⼀: 开启SSH长连接 Ansible模式是使⽤SSH和远程主机进⾏通信, 所以Ansi ...
- 如何使用C#在Excel中插入分页符
在日常办公中,我们经常会用到Excel文档来帮助我们整理数据.为了方便打印Excel工作表,我们可以在Excel中插入分页符.各种处理软件一般都会自动按照用户所设置页面的大小自动进行分页,以美化文档的 ...
- 【Spring系列】- Spring循环依赖
Spring循环依赖 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Spring循 ...
- 【SQL基础】【关键字大写】条件查询:比较、不等于、IN、为空、BETWEEN
〇.概述 1.内容介绍 条件查询:比较.不等于.IN.为空.BETWEEN 2.建表语句 drop table if exists user_profile; CREATE TABLE `user_p ...
- 【每日一题】【位于index后的双指针&排序数组】15. 三数之和/NC54 数组中相加和为0的三元组-211117/220206
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...
- 猿人学web爬虫攻防大战
这里有1.2.3.4.12.13.15题 1.第一题 import execjs import requests def get_response(): js_code = ""& ...
- 利用云服务提供商的免费证书,在服务器上发布https前端应用和WebAPI的应用
我们如果要在服务器上发布https前端应用和WebAPI的应用,那么我们就需要用到https证书了.我们一般发布的应用的云服务器上,都会提供一定量的相关的免费证书(一般为20个)供我们使用,每个一年期 ...
- CCS选择器 选择器优先级 选择器常见属性
目录 CSS前戏 1.css语法结构 2.css注释语法 3.引入css的多种方式 CSS基本选择器 1.标签选择器 2.类选择器 3.id选择器 4.通用选择器 CSS组合选择器 1.后代选择器(空 ...
- 2022年7月12,第四组,周鹏,被算法折磨的一天【哭】【哭】【哭】【puls哭】
今天学习了JS的几种循环语法,说实话,前几天的简单让我大意了,没有闪,很成功的被搞崩了! 一杯水,一根烟,一个算法边写边骂是一天. 多少次,我满怀期待的以为它会出现想要的结果, 但现实的残酷狠狠的折磨 ...
- [机器学习] sklearn支持向量机
支持向量机SVM(Support Vector Machine)是一种用来进行模式识别.分类.回归的机器学习模型. SVM原理描述 模型表示 以一个客户好坏分类为案例,客户信息如下所示: 客户信息数轴 ...