插入排序
1798: 插入排序(CSP-J 2021 T2)
题目描述
揷入排序是一种非常常见且简单的排序算法。小 ZZ 是一名大一的新生, 今天 HH 老师刚刚在上课的时候讲了 揷入排序算法。
假设比较两个元素的时间为 O(1)O(1), 则揷入排序可以以 O(n2)O(n2) 的时间复杂度完成长度为 nn 的数组的排序。 不妨假设这 nn 个数字分别存储在 a1,a2,…,ana1,a2,…,an 之中, 则如下伪代码给出了揷入排序算法的一种最简单的 实现方式:
假设比较两个元素的时间为 O(1)O(1), 则揷入排序可以以 O(n2)O(n2) 的时间复杂度完成长度为 nn 的数组的排序。 不妨假设这 nn 个数字分别存储在 a1,a2,…,ana1,a2,…,an 之中, 则如下伪代码给出了揷入排序算法的一种最简单的 实现方式:
这下面是 C/C++C/C++ 的示范代码:

为了帮助小 ZZ 更好的理解揷入排序, 小 ZZ 的老师 HH 老师留下了这么一道家庭作业:
HH 老师给了一个长度为 nn 的数组 aa, 数组下标从 1 开始, 并且数组中的所有元素均为非负整数。小 ZZ 需要 支持在数组 aa 上的 QQ 次操作, 操作共两种, 参数分别如下:
1xv1xv : 这是第一种操作, 会将 aa 的第 xx 个元素, 也就是 axax 的值, 修改为 vv 。保证 1≤x≤n,1≤1≤x≤n,1≤ v≤109v≤109 。注意这种操作会改变数组的元素, 修改得到的数组会被保留, 也会影响后续的操作。
2x:2x: 这是第二种操作,假设 HH 老师按照上面的伪代码对 aa 数组进行排序, 你需要告诉 HH 老师原来 aa 的第 xx 个元素, 也就是 axax, 在排序后的新数组所处的位置。保证 1≤x≤n1≤x≤n 。注意这种操作不会改变数组的 元素,排序后的数组不会被保留,也不会影响后续的操作。
HH 老师不喜欢过多的修改, 所以他保证类型 1 的操作次数不超过 5000 。
小 Z 没有学过计算机竞赛, 因此小 ZZ 并不会做这道题。他找到了你来帮助他解决这个问题。
输入
第一行, 包含两个正整数 n,Qn,Q, 表示数组长度和操作次数。
第二行, 包含 nn 个空格分隔的非负整数, 其中第 ii 个非负整数表示 ai 。 ai 。
接下来 QQ 行, 每行 2∼32∼3 个正整数, 表示一次操作, 操作格式见【题目描述】。
第二行, 包含 nn 个空格分隔的非负整数, 其中第 ii 个非负整数表示 ai 。 ai 。
接下来 QQ 行, 每行 2∼32∼3 个正整数, 表示一次操作, 操作格式见【题目描述】。
输出
对于每一次类型为22的询问,输出一行一个正整数表示答案。
样例输入 复制
3 4
3 2 1
2 3
1 3 2
2 2
2 3
样例输出 复制
1
1
2
分析(由于自己不怎么会说,所以直接照搬 冯子坤 的解释):
a[i]排序后的新下标=数组中上比a[i]小的数的个数+a[i]前面值和a[i]的值相等的数的个数+1
a[j]<a[i],a[j]对a[i们]的新下标有一个1的贡献
j<i,a[j]=a[i],a[j]对a[]的新下标有一个1的贡献
a[i]排序后的下标是是根据和其他值的相对位置和大小决定
假设我修改了a[x],p数组只会被旧的a[x]和新的a[x]影响
而不需要考虑其他值
ok,冯子坤还是挺给力的
#include<bits/stdc++.h> using namespace std; int n,q,a[10005],p[10005],o,x,v; int main() { cin>>n>>q; for(int i=1; i<=n; i++) { cin>>a[i]; } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) { continue; } if(a[j]<a[i]) { p[i]++; } if(j<i&&a[i]==a[j]) { p[i]++; } } } while(q--) { cin>>o; if(o==1) { cin>>x>>v; p[x]=0; for(int i=1; i<=n; i++) { if(i==x) {
continue;
} if(a[x]<a[i]) { p[i]--; } if(i>x&&a[x]==a[i]) { p[i]--; } if(a[i]>v) { p[i]++; } if(i>x&&a[i]==v) { p[i]++; } if(a[i]<v) { p[x]++; } if(i<x&&a[i]==v) { p[x]++; } } a[x]=v; } else { cin>>x; cout<<p[x]+1<<endl; } } return 0; }
over

浙公网安备 33010602011771号