点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int e[N],ne[N],idx,head=-1;
int pos[N];
//此题的关键是查询数值,需要根据数值来查询到一个元素的后面一个元素是什么
//那就通过遍历了,思路不难
//遍历效率太低了,最高是100000次,需要一个映射数组
void add_to_head(int x)
{
e[idx]=x;
ne[idx]=head;
pos[x]=idx;
head=idx++;
}
void init()
{
head=-1;
idx=0;
memset(pos,-1,sizeof(pos));
add_to_head(1);
}
void add(int k,int x)
{
e[idx]=x;
ne[idx]=ne[k];
pos[x]=idx;
ne[k]=idx++;
}
void remove(int k)
{
pos[e[ne[k]]]=-1;
ne[k]=ne[ne[k]];
}
//然后为了实现题目的所有操作需要根据元素值找到对应的下标
int main()
{
init();
int q;
cin>>q;
while(q--){
int op,x,y;
cin>>op;
if(op==1){
cin>>x>>y;
add(pos[x],y);
}else if(op==2){
cin>>x;
if(ne[pos[x]]==-1) printf("0\n");
else cout<<e[ne[pos[x]]]<<endl;
}else if(op==3){
cin>>x;
remove(pos[x]);
}
}
return 0;
}
本题的核心就在于通过元素值找到对应的下标,用遍历的方法太低效了,真正高效的方法是利用映射数组
每给出一个值就将它的值与下标对应,通过映射数组直接访问下标