2019湖南省赛 双向链表练习题

2024-04-16 01:38

本文主要是介绍2019湖南省赛 双向链表练习题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

双向链表练习题
Bobo 有 n n n 个列表 L 1 , L 2 , … , L n L_1, L_2, \dots, L_n L1,L2,,Ln. 初始时, L i L_i Li 仅包含元素 i i i, 即 L i = [ i ] L_i = [i] Li=[i]. 他依次执行了 m m m 次操作。第 i i i 次操作由两个整数 a i , b i a_i, b_i ai,bi 指定, 每次操作分为两步:

L a i ← r e v e r s e ( L a i + L b i ) L_{a_i} \leftarrow \mathrm{reverse}(L_{a_i} + L_{b_i}) Laireverse(Lai+Lbi), 其中 ← \leftarrow 表示赋值, + + + 表示列表的连接, r e v e r s e \mathrm{reverse} reverse 表示列表的反转。例如, r e v e r s e ( [ 1 , 2 ] + [ 3 , 4 , 5 ] ) = [ 5 , 4 , 3 , 2 , 1 ] \mathrm{reverse}([1, 2] + [3, 4, 5]) = [5, 4, 3, 2, 1] reverse([1,2]+[3,4,5])=[5,4,3,2,1].
L b i ← [ ] L_{b_i} \leftarrow [] Lbi[]. 其中 [ ] [] [] 表示空的列表。
输出 m m m 次操作后, L 1 L_1 L1 的元素。

输入格式
输入文件包含多组数据,请处理到文件结束。

每组数据的第一行包含两个整数 n n n m m m.

接下来 m m m 行,其中第 i i i 行包含 2 2 2 个整数 a i , b i a_i, b_i ai,bi.

1 ≤ n , m ≤ 1 0 5 1 \leq n, m \leq 10^5 1n,m105
1 ≤ a i , b i ≤ n , a i ≠ b i 1 \leq a_i, b_i \leq n, a_i \neq b_i 1ai,bin,ai=bi
n n n 的总和, m m m 的总和都不超过 5 × 1 0 5 5 \times 10^5 5×105.
输出格式
对于每组数据,先输出 L 1 L_1 L1 的长度 ∣ L 1 ∣ |L_1| L1,再输出 ∣ L 1 ∣ |L_1| L1 个整数,表示 L 1 L_1 L1 的元素。

思路:
链表练习题。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <list>using namespace std;const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + 7;
list<int>lst1[maxn],lst2[maxn];int main()
{int n,m;while(~scanf("%d%d",&n,&m)){for(int i = 1;i <= n;i++){lst1[i].clear();lst1[i].push_back(i);lst2[i].clear();lst2[i].push_back(i);}for(int i = 1;i <= m;i++){int x,y;scanf("%d%d",&x,&y);lst1[x].splice(lst1[x].end(),lst1[y]);lst2[y].splice(lst2[y].end(),lst2[x]);swap(lst2[x],lst2[y]);swap(lst1[x],lst2[x]);}int len = (int)lst1[1].size();printf("%d ",len);while(len--){printf("%d ",lst1[1].front());lst1[1].pop_front();}printf("\n");}return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <list>using namespace std;const int INF = 0x3f3f3f3f;
const int maxn = 100005;
int nex[maxn],lst[maxn];
int L[maxn],R[maxn],cnt[maxn];
int vis[maxn];void link(int x,int y)
{if(nex[x] == x && nex[y] == y){nex[x] = y;nex[y] = x;}else if(nex[x] == x && lst[y] == y){nex[x] = y;lst[y] = x;}else if(lst[x] == x && nex[y] == y){lst[x] = y;nex[y] = x;}else if(lst[x] == x && lst[y] == y){lst[x] = y;lst[y] = x;}
}int main()
{int n,m;while(~scanf("%d%d",&n,&m)){for(int i = 1;i <= n;i++){vis[i] = 0;cnt[i] = 1;lst[i] = nex[i] = i;L[i] = R[i] = i;}for(int i = 1;i <= m;i++){int x,y;scanf("%d%d",&x,&y);if(x == y){swap(L[x],R[x]);continue;}cnt[x] += cnt[y];cnt[y] = 0;if(L[y] == 0 && R[y] == 0){swap(L[x],R[x]);continue;}if(L[x] == 0 && R[x] == 0){L[x] = L[y];R[x] = R[y];swap(L[x],R[x]);L[y] = R[y] = 0;continue;}link(R[x],L[y]);R[x] = R[y];L[y] = R[y] = 0;swap(L[x],R[x]);}printf("%d ",cnt[1]);for(int i = L[1];i;){printf("%d ",i);vis[i] = 1;if(!vis[nex[i]]){i = nex[i];}else if(!vis[lst[i]]){i = lst[i];}else{break;}}printf("\n");}return 0;
}

这篇关于2019湖南省赛 双向链表练习题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907482

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

c++ 链表详细介绍

链表是数据结构的一种,由节点组成,每个节点包含数据和指向下一个节点的指针。链表在C++中的实现可以是单链表、双链表或循环链表。以下是链表的详细介绍: 1. 单链表 结构: 节点(Node):每个节点包含数据和一个指针(next),指向链表中的下一个节点。 示例结构: struct Node {int data;Node* next;Node(int d) : data(d), next(