列表

详情


NC53392. 双向链表练习题

描述

Bobo 有 n 个列表 .
初始时,L_i 仅包含元素 i, 即 .
他依次执行了 m 次操作。第 i 次操作由两个整数 a_i, b_i 指定, 每次操作分为两步:
1. , 其中 表示赋值,+ 表示列表的连接, 表示列表的反转。例如,.
2. . 其中 [] 表示空的列表。
输出 m 次操作后, L_1 的元素。

输入描述

输入文件包含多组数据,请处理到文件结束。
每组数据的第一行包含两个整数 n 和 m.
接下来 m 行,其中第 i 行包含 2 个整数 a_i, b_i.

*
*
* n 的总和,m 的总和都不超过 .

输出描述

对于每组数据,先输出 L_1 的长度 ,再输出  个整数,表示 L_1 的元素。

示例1

输入:

2 1
1 2
2 1
2 1
3 3
3 2
3 2
1 3

输出:

2 2 1
0
3 2 3 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 202ms, 内存消耗: 15584K, 提交时间: 2020-10-13 18:43:06

#include"bits/stdc++.h"
using namespace std;
list<int> a[100001],b[100001];

int main()
{
	int n,m;
	while(cin>>n>>m)
	{
		for(int i=1;i<=n;i++)
		{
			a[i].clear();
			a[i].push_back(i);
			b[i].clear(); 
			b[i].push_back(i);
		}
		for(int i=1;i<=m;i++)
		{
			int x,y;
			cin>>x>>y;
			a[x].splice(a[x].end(),a[y]);
			b[y].splice(b[y].end(),b[x]);
			swap(a[x],b[y]);
			swap(b[y],b[x]);
			
			a[y].clear();
			b[y].clear();
			
		}
		cout<<a[1].size()<<" ";
		for(list<int>::iterator it=a[1].begin();it!=a[1].end();it++)
		{
			cout<<*it<<" ";
	 	} 
	 	cout<<endl;
	 	
	}

	return 0;
 } 

C++(g++ 7.5.0) 解法, 执行用时: 198ms, 内存消耗: 12524K, 提交时间: 2022-09-19 11:23:54

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
const int N=1e5+10;
list<int> l1[N],l2[N];//l1存逆序  l2存顺序 
int main()
{
	int n,m;
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=1;i<=n;i++)
		{
			l1[i].clear();
			l2[i].clear();
			l1[i].push_back(i);
			l2[i].push_back(i);
		}
		for(int i=1;i<=m;i++)
		{
			int a,b;
			cin>>a>>b;
			l1[a].splice(l1[a].end(),l1[b]);
			l2[b].splice(l2[b].end(),l2[a]);
			swap(l1[a],l2[b]);
			swap(l2[b],l2[a]);
		}
		printf("%d ",l1[1].size());
		for(auto s:l1[1])
			printf("%d ",s);
		printf("\n");
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 210ms, 内存消耗: 15756K, 提交时间: 2019-10-22 18:12:26

#include<bits/stdc++.h>
using namespace std;

list<int>X[100005],Y[100005];
int main()
{
	int i,a,b,n,m;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=1;i<=n;i++)X[i].clear(),X[i].push_back(i),Y[i].clear(),Y[i].push_back(i);
		while(m--) 
		{
			scanf("%d%d",&a,&b);
			X[a].splice(X[a].end(),X[b]),Y[b].splice(Y[b].end(),Y[a]);
			swap(X[a],Y[b]),swap(Y[a],Y[b]);
			X[b].clear(),Y[b].clear();
		}
		printf("%d",X[1].size());
		for(list<int>::iterator j=X[1].begin();j!=X[1].end();j++)printf(" %d",*j);
		printf("\n");
	}
	return 0;
}

上一题