P7910 [CSP-J 2021] 插入排序 题解
正解
首先要注意 \(2\) 点:
- 修改数组元素的值 会影响 接下来的操作.
- 对数组进行排序 不会影响 接下来的操作.
思路
直接扫一遍数组.假设排序后 \(a_x\) 会在第 \(p\) 位上. 将 \(p\) 初始化为 \(n\).
然后就开始找 \(x\) 前后有多少个小于 \(a_x\) 的值就行了.
时间复杂度:\(\Theta (nq)\).
注意事项
插入排序是 稳定 的一种排序算法
改成 \(cin\) 会 TLE,所以使用 \(scanf\) 或者快读.
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n, q;
int a[8003];
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
while (q--) {
int op, x, v;
scanf("%d", &op);
if (op == 1) {
scanf("%d%d", &x, &v);
a[x] = v;
}
else {
scanf("%d", &x);
int p = n; // 初始化
for (int i = 1; i < x; i++) // 前 x-1 个
if (a[i] > a[x]) p--;
for (int i = x + 1; i <= n; i++) // 后面 x+1 ~ n 个
if (a[i] >= a[x]) p--; // 稳定的排序算法,所以本来在x后面的还得在x后面
printf("%d\n", p);
}
}
return 0;
}