【题目来源】
https://www.luogu.com.cn/problem/B3631
【题目描述】
实现一个数据结构,维护一张表(最初只有一个元素 1)。需要支持下面的操作,其中 x 和 y 都是 1 到 10^6 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 10^5:
● 1 x y :将元素 y 插入到 x 后面;
● 2 x :询问 x 后面的元素是什么。如果 x 是最后一个元素,则输出 0;
● 3 x:从表中删除元素 x 后面的那个元素,不改变其他元素的先后顺序。
【输入格式】
第一行一个整数 q 表示操作次数。
接下来 q 行,每行表示一次操作,操作具体间题目描述。
【输出格式】
对于每个操作 2,输出一个数字,用换行隔开。
【输入样例】
6
1 1 99
1 99 50
1 99 75
2 99
3 75
2 1
【输出样例】
75
99
【算法分析】
● 快读函数:https://blog.csdn.net/hnjzsyjyj/article/details/120131534
int read() { //fast readint x=0,f=1;char c=getchar();while(c<'0' || c>'9') { //!isdigit(c)if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') { //isdigit(c)x=x*10+c-'0';c=getchar();}return x*f;
}int x=read();
当输入数据范围超过 10^6 时,建议采用“快读”函数,否则容易导致 TLE。
【算法代码】
#include <bits/stdc++.h>
using namespace std;const int maxn=1e6+5;
int ne[maxn];void insert() {int x,y;cin>>x>>y;ne[y]=ne[x];ne[x]=y;
}void find() {int x;cin>>x;cout<<ne[x]<<endl;
}void del() {int x;cin>>x;ne[x]=ne[ne[x]];
}int main() {int T;cin>>T;while(T--) {int op;cin>>op;switch(op) {case 1:insert();break;case 2:find();break;case 3:del();break;}}return 0;
}/*
in:
6
1 1 99
1 99 50
1 99 75
2 99
3 75
2 1out:
75
99
*/
【参考文献】
https://blog.csdn.net/Engels_Si_Fish/article/details/137658270
https://blog.csdn.net/qingmengk_k/article/details/137395009