问题标题: 酷町堂:7145整理书本

0
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


0
已采纳
刘小川
刘小川
中级天翼
中级天翼

我对楼上两位的答案“大”有感触

0
0
我要回答