0
已解决
王梓轩
资深光能
资深光能
7145 整理书本(book)
经验值:2000
时间限制:1000毫秒
内存限制:128MB
合肥市第38届信息学竞赛(2021年)
不许抄袭,一旦发现,直接清空经验!
题目描述 De**ion
又一个学期结束了,又积累了好多本书,你决定好好整理一下,整理时共有
三种操作,规则如下:
1,p 表示把编号为 p 的书放到最前面;
2,p 表示把编号为 p 的书放到最后面;
3,p q 表示把编号为 p 的书放到编号为 q 的书的后面;
1、2、3 分别代表整理操作的种类,p、q 表示书的编号,他们之间由空格分隔;已知在整理之前,所有书从 1 开始依次编号排放。
输入描述 Input De**ion
共 m+1 行。第一行有两个由空格分隔的正整数 n 和 m,分别表示 n 本书和 m 次整理操作,接下来 m 行,每行有 2 个或 3 个由空格分隔的正整数,对应上述三种整理操作。
输出描述 Output De**ion
共 1 行,经过整理后的书本顺序,书本间用空格隔开。
样例输入 Sample Input
10 4 1 3 2 4 3 3 6 3 1 5
样例输出 Sample Output
2 5 1 6 3 7 8 9 10 4
数据范围及提示 Data Size & Hint
数据范围:1≤n,m≤100000
#include<bits/stdc++.h>
using namespace std;
int l[100005],r[100005],n,m,p,q;//l前驱,r后继
int main()
{
cin>>n>>m;
r[0]=n+1,l[n+1]=0;
for(int i=1;i<=n;i++)
l[i]=l[n+1],r[i]=n+1,l[r[i]]=i,r[l[i]]=i;
for(int i=1;i<=m;i++)
{
cin>>p;
if(p==1)cin>>p,r[l[p]]=r[p],l[r[p]]=l[p],l[p]=0,r[p]=r[0],l[r[p]]=p,r[l[p]]=p;
else if(p==2)cin>>p,r[l[p]]=r[p],l[r[p]]=l[p],l[p]=l[n+1],r[p]=n+1,l[r[p]]=p,r[l[p]]=p;
else if(p==3)cin>>p>>q,r[l[p]]=r[p],l[r[p]]=l[p],l[p]=q,r[p]=r[q],l[r[p]]=p,r[l[p]]=p;
}
int idx=r[0];
while(idx!=n+1)cout<<idx<<" ",idx=r[idx];
}
80WA