P7910 [CSP-J 2021] 插入排序 题解

正解

首先要注意 \(2\) 点:

  1. 修改数组元素的值 会影响 接下来的操作.
  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;
}
posted @ 2024-10-23 12:35  Panda_LYL  阅读(38)  评论(0)    收藏  举报