AT_abc344_e的题解

(一)

这次 ABC 有点水。

每个数记录前面那个数,和后面那个数。

对于每个数,开个数组记录值,用 map 记录一个值的位置

(二)

AC 代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int pre[400010],cnt,las[400010],a[400010],n,q;
map<int,int>mp;
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),mp[a[i]]=i;
	cnt=n+2;
	for(int i=1;i<=n;i++)pre[i]=i-1,las[i]=i+1;
	las[0]=1,pre[n+1]=n;
	scanf("%lld",&q);
	while(q--){
		int op,x,y;
		scanf("%lld%lld",&op,&x);
		if(op==2){
			int pos=mp[x];
			int l=pre[pos],r=las[pos];
			mp[x]=0;
			pre[r]=l,las[l]=r;
		}
		else{
			scanf("%lld",&y);
			int pos=mp[x];
			mp[y]=++cnt;
			a[cnt]=y;
			pre[cnt]=pos,las[cnt]=las[pos];
			las[pos]=cnt;pre[las[cnt]]=cnt;
		}
	}
	int now=las[0];
	while(now!=n+1){
		printf("%lld ",a[now]);
		now=las[now];
	}
	return 0;
}
posted @ 2024-03-27 12:20  Jerry_heng  阅读(35)  评论(0)    收藏  举报