正解
首先要注意 $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;
}
标签:int,题解,插入排序,scanf,数组,排序,P7910
From: https://www.cnblogs.com/panda-lyl/p/18496121