首页 > 其他分享 >[CSP-J 2021] 插入排序

[CSP-J 2021] 插入排序

时间:2023-09-22 10:37:32浏览次数:47  
标签:le val 测试点 插入排序 2021 数组 CSP sim

题目描述

插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。

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

这下面是 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;

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

H 老师给了一个长度为 \(n\) 的数组 \(a\),数组下标从 \(1\) 开始,并且数组中的所有元素均为非负整数。小 Z 需要支持在数组 \(a\) 上的 \(Q\) 次操作,操作共两种,参数分别如下:

\(1~x~v\):这是第一种操作,会将 \(a\) 的第 \(x\) 个元素,也就是 \(a_x\) 的值,修改为 \(v\)。保证 \(1 \le x \le n\),\(1 \le v \le 10^9\)。注意这种操作会改变数组的元素,修改得到的数组会被保留,也会影响后续的操作

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

H 老师不喜欢过多的修改,所以他保证类型 \(1\) 的操作次数不超过 \(5000\)。

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

输入格式

第一行,包含两个正整数 \(n, Q\),表示数组长度和操作次数。

第二行,包含 \(n\) 个空格分隔的非负整数,其中第 \(i\) 个非负整数表示 \(a_i\)。

接下来 \(Q\) 行,每行 \(2 \sim 3\) 个正整数,表示一次操作,操作格式见【题目描述】。

输出格式

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

样例 #1

样例输入 #1

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

样例输出 #1

1
1
2

提示

【样例解释 #1】

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

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

注意虽然此时 \(a_2 = a_3\),但是我们不能将其视为相同的元素

【样例 #2】

见附件中的 sort/sort2.insort/sort2.ans

该测试点数据范围同测试点 \(1 \sim 2\)。

【样例 #3】

见附件中的 sort/sort3.insort/sort3.ans

该测试点数据范围同测试点 \(3 \sim 7\)。

【样例 #4】

见附件中的 sort/sort4.insort/sort4.ans

该测试点数据范围同测试点 \(12 \sim 14\)。

【数据范围】

对于所有测试数据,满足 \(1 \le n \le 8000\),\(1 \le Q \le 2 \times {10}^5\),\(1 \le x \le n\),\(1 \le v,a_i \le 10^9\)。

对于所有测试数据,保证在所有 \(Q\) 次操作中,至多有 \(5000\) 次操作属于类型一。

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

测试点 \(n \le\) \(Q \le\) 特殊性质
\(1 \sim 4\) \(10\) \(10\)
\(5 \sim 9\) \(300\) \(300\)
\(10 \sim 13\) \(1500\) \(1500\)
\(14 \sim 16\) \(8000\) \(8000\) 保证所有输入的 \(a_i,v\) 互不相同
\(17 \sim 19\) \(8000\) \(8000\)
\(20 \sim 22\) \(8000\) \(2 \times 10^5\) 保证所有输入的 \(a_i,v\) 互不相同
\(23 \sim 25\) \(8000\) \(2 \times 10^5\)

算法分析

这是普及组第二题啊,啥时候普及组第二题也这么有难度了?我们来看100%的数据,即使回答是\(O(n)\),时间复杂度是16亿,也不行,更何况排序的时间复杂度是\(O(nlogn)\),根本过不去
我一直纠结在这个问题上,感觉这个题无解

但是这个题有一个非常重要的性质,保证修改的次数最多有5000次,但是看到这个性质的时候,第一想法就是询问次数这么多,时间复杂度太大了,但最终的答案是要利用这一个性质做文章,我们将之前的序列排好序,每次修改只会修改一个元素,我们只需要\(O(N)\)的给这个元素找好位置即可。使用冒泡排序的思想就可以,所以这样的时间复杂度是5000*8000,回答第二类询问的时候,只需要\(O(1)\)的回答即可。

当然,之前做这个题的时候,还有一个问题一直解决不了,我们使用\(w[i]\)表示第i个元素在新排序的数组中的位置,当我们在冒泡排序的时候,这个数组很难记录,当时没有想到结构体数组,我们使用结构体可以记录每个元素的值val和位置id,那么这样的话,id和val始终进行关联,同时我们也能很方便的记录\(W数组\)了

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=8005;
int n,q,w[maxn];
struct Val{
    int val,id;
}v[maxn];
bool cmp(Val a,Val b){
    if(a.val==b.val) return a.id<b.id;
    else return a.val<b.val;
}
int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&v[i].val);
        v[i].id=i;
    }
    sort(v+1,v+1+n,cmp);
    for(int i=1;i<=n;i++){
        w[v[i].id]=i;
    }
    for(int k=1;k<=q;k++){
        int op,x,y;
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&x,&y);
            int pos;
            for(int i=1;i<=n;i++)
                if(v[i].id==x) {
                    v[i].val=y;
                    pos=i;
                }
            for(int i=pos;i>=2;i--){
                if(v[i].val<v[i-1].val){
                    swap(v[i],v[i-1]);
                    continue;
                }
                if(v[i].val==v[i-1].val&&v[i].id<v[i-1].id){
                    swap(v[i],v[i-1]);
                }
            }
            for(int i=pos;i<n;i++){
                if(v[i].val>v[i+1].val){
                    swap(v[i],v[i+1]);
                    continue;
                }
                if(v[i].val==v[i+1].val&&v[i].id>v[i+1].id){
                    swap(v[i],v[i+1]);
                }
            }
            for(int i=1;i<=n;i++){
                w[v[i].id]=i;
            }
            
        }else{
            scanf("%d",&x);
            printf("%d\n",w[x]);
        }
    }
    return 0;
}
/**
 5 20
 1 4 9 5 6
 1 2 10
 1 3 2
 2 2
 2 3
 1 4 1
 2 4
 2 3
 2 2
 2 5
 1 4 12
 2 4
 2 3
 2 1
 1 1 19
 2 3
 2 1
 2 4
 1 1 1
 2 3
 2 2
 */

标签:le,val,测试点,插入排序,2021,数组,CSP,sim
From: https://www.cnblogs.com/sdfzls/p/17721706.html

相关文章

  • The 2021 China Collegiate Programming Contest (Harbin) JBEID
    The2021ChinaCollegiateProgrammingContest(Harbin)JBEIDJ.LocalMinimum模拟题意:一个数当且仅当它是当前列最小值同时也是当且行的最小值它才算入贡献。思路:直接\(for\),预处理出每一行每一列的最小值,然后去\(check\)每一个数。//AConemoretimes//nndbk#inc......
  • 【枚举】【贪心技巧】【集训队互测2021】子集匹配
    题目描述给定\(n,k(2k\geqn)\),二进制中有\(k\)个\(1\)的不超过\(n\)位的数有\(\binom{n}{k}\)个,有\(k-1\)个\(1\)的有\(\binomn{k-1}\)个,后者显然大于等于前者,要求对于每一个\(k\)个\(1\)的数\(x\),都找出一个\(k-1\)位的数\(y\)与之对应,且\(x......
  • 2023年9月天津/济南/深圳CSPM-3国标项目管理中级认证报名
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • 揭秘ES2021令人兴奋的语言特性
    大家好!我是星辰编程理财。今天我分享一篇关于ES2021(ES12)的文章,它将介绍ES2021的语言特性和功能,包括WeakRefs、Logicalassignmentoperators、Privatemethodsandaccessors(classfields)、Promise.allSettled()等等。通过故事形式以及详细的阐述和示例,带领大家一起探索这些特性......
  • 揭秘ES2021令人兴奋的语言特性
    大家好!我是星辰编程理财。今天我分享一篇关于ES2021(ES12)的文章,它将介绍ES2021的语言特性和功能,包括WeakRefs、Logicalassignmentoperators、Privatemethodsandaccessors(classfields)、Promise.allSettled()等等。通过故事形式以及详细的阐述和示例,带领大家一起探索这些特......
  • 直接插入排序算法及其改进
    插入排序,分为直接插排,和二分插排直接插入排序大体思路:选取<数组>,将其余数依次按顺序往里放。(C语言实现)#include<stdio.h>voidinsertSort(int*a);intmain(){inta[6]={5,2,4,6,1,3};//这里也可以改成自定义数组insertSort(a);intk;for(k=0;......
  • 希尔排序:优化的插入排序
    希尔排序(ShellSort)是一种插入排序的改进算法,它通过比较相距一定间隔的元素进行排序,逐步减小间隔,最终实现整体有序。本文将详细介绍希尔排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。希尔排序的基本思想希尔排序的核心思想是将整个待排序序列分割成若干个子序列,......
  • 2023年9月上海/杭州/深圳CSPM-3国标项目管理中级认证报名
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • 2023CSP-J游寄
    Day-3水帖。Day-2水帖(寒)。Day-1还是水帖。。。Day0考前在比赛开始前水了会帖。。。星期六基本都在补课,早上的课请了假。跑到三楼的\(304\)考场,小学生扎堆。考中感觉今年比较简单一点点。有些不会的题都蒙对了。考完后的一个小时都在摆烂,也就翻翻卷子,看看时间,无......
  • 2023 CSP-J/S游记
    8.14打了场\(luogu\)的\(SCP\),给打没信心了。9.5二调讲评结束后,和班主任说了考\(CSP\)的事情,就当做请假了。班主任说考\(CSP\)的那天放假。(实际上是考\(CSP\)的后一天,好耶)9.8被@wangyunbiao告知今年可能没有奖励名额,于是开始复习初赛。在机房看见了“复活”的......