洛谷 B3631:单向链表 ← 单链表

【题目来源】
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





 

猜你喜欢

转载自blog.csdn.net/hnjzsyjyj/article/details/143440454