CSP-J 2021 第二题:插入排序

【题目来源】
https://www.luogu.com.cn/problem/P7910
https://www.acwing.com/problem/content/description/4090/

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=8005;
int n,Q;
int o2x[maxn]; //o2x[i] represents the position in the new sequence

struct node {
	int v,id; //p[i].id represents the original sequence
} p[maxn];

bool cmp(node x,node y) {
	if(x.v!=y.v) return x.v<y.v;
	return x.id<y.id;
}

int main() {
	scanf("%d%d",&n,&Q);
	for(int i=1; i<=n; i++) {
		scanf("%d",&p[i].v);
		p[i].id=i;
	}
	
	sort(p+1,p+1+n,cmp);
	
	for(int i=1; i<=n; i++) o2x[p[i].id]=i;
	
	while(Q--) {
		int op;
		scanf("%d",&op);
		if(op==1) {
			int x,y;
			scanf("%d%d",&x,&y);
			p[o2x[x]].v=y;
			for(int j=o2x[x]; j>=2; j--)
				if(p[j].v<p[j-1].v || p[j].v==p[j-1].v&&p[j].id<p[j-1].id) {
					swap(p[j],p[j-1]);
					o2x[p[j].id]=j;
					o2x[p[j-1].id]=j-1;
				} else break;
			
			for(int j=o2x[x]; j<=n-1; j++)
				if(p[j].v>p[j+1].v || p[j].v==p[j+1].v&&p[j].id>p[j+1].id) {
					swap(p[j],p[j+1]);
					o2x[p[j].id]=j;
					o2x[p[j+1].id]=j+1;
				} else break;
		} 
		else {
			int x;
			scanf("%d",&x);
			printf("%d\n",o2x[x]);
		}
	}
	return 0;
}


/*
in:
3 4
3 2 1
2 3
1 3 2
2 2
2 3

out:
1
1
2
*/

【参考文献】
https://mp.weixin.qq.com/s/_AcD-C1S4rTRVCo7IVWnAA

Guess you like

Origin blog.csdn.net/hnjzsyjyj/article/details/121733509