AcWing 4087. 插入排序
原题链接
中等
作者:
懒惰的蚩蚩
,
2024-10-02 11:27:47
,
所有人可见
,
阅读 8
这题对于我来说是个很困难的题目,感觉太绕了。
#include<bits/stdc++.h>
using namespace std;
const int N = 8e3 + 15;
int n, q;
int tmp[N];
struct node{
int value;
int id;
}a[N];
bool cmp(node a, node b) {
if(a.value != b.value) return a.value < b.value;
else return a.id < b.id;
}
//模拟快速排序
//因为第一次sort()已经单调有序了
//之后就只需要判断这个新插入的数能往前或者往后走到哪里
//让新的数组有序,这样可以优化到O(n)
void quick_sort(int x, int v) {
a[tmp[x]].value = v;
int pos = tmp[x];
//向左边走
while(pos > 1 && cmp(a[pos], a[pos - 1])) {
swap(a[pos], a[pos - 1]);
tmp[a[pos].id] = pos;
pos--;
}
//向右边走
while(pos < n && cmp(a[pos + 1], a[pos])) {
swap(a[pos + 1], a[pos]);
tmp[a[pos].id] = pos;
pos++;
}
//刷新一下,id和i的映射关系
for(int i = 1; i <= n; i++) tmp[a[i].id] = i;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
int num = 0;
for(int i = 1; i <= n; i++) {
cin >> num;
a[i].value = num;
a[i].id = i;
}
//第一遍需要先排个序
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i++) tmp[a[i].id] = i;
int op, x, v;
while(q--) {
cin >> op;
if(op == 1) {
cin >> x >> v;
quick_sort(x, v);
}else if(op == 2) {
cin >> x;
cout << tmp[x] << endl;
}
}
return 0;
}