NC229919. [CSP2021]插入排序(sort)
描述
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;
为了帮助小 更好的理解插入排序,小 的老师 老师留下了这么一道家庭作业:
老师给了一个长度为的数组,数组下标从开始,并且数组中的所有元素均为非负整数。小 需要支持在数组上的次操作,操作共两种,参数分别如下:
: 这是第一种操作,会将的第个元素,也就是的值,修改为。保证。 注意这种操作会改变数组的元素, 修改得到的数组会被保留, 也会影响后续的操作。
: 这是第二种操作,假设 H 老师按照上面的伪代码对数组进行排序,你需要告诉 老师原来的第个元素,也就是,在排序后的新数组所处的位置。保证。 注意这种操作不会改变数组的元素, 排序后的数组不会被保留, 也不会影响后续的操作 。
老师不喜欢过多的修改,所以他保证类型的操作次数不超过。
输入描述
输入的第一行包含两个正整数,表示数组长度和操作次数。保证。
输入的第二行包含个空格分隔的非负整数,其中第个非负整数表示。保证。
接下来行,每行个正整数,表示一次操作,操作格式见题目描述。
输出描述
对于每一次类型为的询问,输出一行一个正整数表示答案。
示例1
输入:
3 4 3 2 1 2 3 1 3 2 2 2 2 3
输出:
1 1 2
说明:
在修改操作之前,假设老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是。
在修改操作之前,假设 老师进行了一次插入排序,则原序列的三个元素在排序结束后所处的位置分别是。
注意虽然此时,但是我们不能将其视为相同的元素。
C++(clang++ 11.0.1) 解法, 执行用时: 597ms, 内存消耗: 1400K, 提交时间: 2022-08-30 08:54:12
#include<bits/stdc++.h> using namespace std; int a[8010]; int main(){ int n,q; cin>>n>>q; for(int i=1;i<=n;i++)scanf("%d",&a[i]); int tp; while(q--){ cin>>tp; if(tp==1){ int x,v; cin>>x>>v; a[x]=v; }else{ int x,ans=0; cin>>x; for(int i=1;i<x;i++){ if(a[i]<=a[x]) ans++; } for(int i=x+1;i<=n;i++){ if(a[i]<a[x]) ans++; } cout<<ans+1<<endl; } } return 0; }