【题目来源】
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 read
int 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 1
out:
75
99
*/
【参考文献】
https://blog.csdn.net/Engels_Si_Fish/article/details/137658270
https://blog.csdn.net/qingmengk_k/article/details/137395009