文章目录
- 题目传送门
- 算法解析
- 总代码
- 提交记录
- 尾声
题目传送门
洛谷 P7910 [CSP-J 2021] 插入排序
算法解析
千万不要题目让你插入排序你就插入排序
首先可以用 p a i r pair pair 来存储元素的值( f i r s t first first)和原来的下标( s e c o n d second second)
再用一个数组 p o s i pos_i posi 来记录原来的第 i i i 个元素现在在第几位
初始化:
scanf("%d%d", &n, &q);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i].first);
a[i].second = pos[i] = i;
}
接下来是重点 !!!
想一下,如果原本序列有序,更改一个数的值,那么一遍冒泡排序就可以维护顺序(即如果它小,则把它往前放,如果它大,则把它往后放,具体请参考代码)
得出函数 s o r t sort sort_ o n c e once once
void sort_once() {
for(int i = 1; i < n; ++i)
if(a[i] > a[i + 1]) {
swap(pos[a[i].second], pos[a[i + 1].second]);
swap(a[i], a[i + 1]);
}
for(int i = n - 1; i > 0; --i)
if(a[i] > a[i + 1]) {
swap(pos[a[i].second], pos[a[i + 1].second]);
swap(a[i], a[i + 1]);
}
}
剩下的就简单了
while(q-- && scanf("%d%d", &op, &x)) {
if(op == 1) {
scanf("%d", &y);
for(int i = 1; i <= n; ++i)
if(a[i].second == x) {
a[i].first = y;
break;
}
sort_once();
} else
printf("%d\n", pos[x]);
}
总代码
#include <cstdio>
#include <algorithm>
#include <utility>
#define N 10005
using namespace std;
int n, q;
pair <int, int> a[N];
int op, x, y;
int pos[N];
void sort_once() {
for(int i = 1; i < n; ++i)
if(a[i] > a[i + 1]) {
swap(pos[a[i].second], pos[a[i + 1].second]);
swap(a[i], a[i + 1]);
}
for(int i = n - 1; i > 0; --i)
if(a[i] > a[i + 1]) {
swap(pos[a[i].second], pos[a[i + 1].second]);
swap(a[i], a[i + 1]);
}
}
int main() {
scanf("%d%d", &n, &q);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i].first);
a[i].second = pos[i] = i;
}
for(int i = 1; i <= n; ++i)
sort_once();
while(q-- && scanf("%d%d", &op, &x)) {
if(op == 1) {
scanf("%d", &y);
for(int i = 1; i <= n; ++i)
if(a[i].second == x) {
a[i].first = y;
break;
}
sort_once();
} else
printf("%d\n", pos[x]);
}
return 0;
}
提交记录
提交记录 · 点这里
尾声
如果这篇博客对您(您的团队)有帮助的话,就帮忙点个赞,加个关注!
最后,祝您(您的团队)在 OI 的路上一路顺风!!!
┬┴┬┴┤・ω・)ノ ByeBye