测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27721. 整理书本(book)

填空题 中等

题目描述

整理书本(book)

题目描述:又一个学期结束了,又积累了好多本书,你决定好好整理一下,整理时共有三种操作,规则如下:

1、p 表示把编号为 p 的书放到最前面

2、p 表示把编号为 p 的书放到最后面

3、p q 表示把编号为 p 的书放到编号为 q 的书的后面

1、2、3 分别代表整理操作的种类,p、q 表示书的编号,他们之间由空格分隔;已知在整理之前,所有书从 1 开始依次编号排放。

输入

共 m+1 行。第一行有两个由空格分隔的正整数 n 和 m,分别表示 n 本书和 m 次整理操作,接下来 m 行,每行有 2 个或 3 个由空格分隔的正整数,

对应上述三种整理操作。

输出

共 1 行,经过整理后的书本顺序,书本间用空格隔开。

样例输入

10 4

1 3

2 4

3 3 6

3 1 5

样例输出

2 5 1 6 3 7 8 9 10 4

数据范围

1≤n,m≤100000

参考答案

#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; struct node { int pre,next,data; } a[N]; int n,m; void init() { for(int i=1; i<=n; i++) { a[i].pre = i-1; a[i].data = i; a[i].next = i+1; } } int main() { scanf("%d%d",&n,&m); init(); int head = 1,end = n; while(m--) { int op,p; scanf("%d%d",&op,&p); int pre = a[p].pre; int nxt = a[p].next; if(op==1) { //放到最前面 if(pre == 0) continue; if(nxt == n+1) end = pre; //换尾 else a[nxt].pre = pre; a[head].pre = p; a[pre].next = nxt; a[p].next = head; a[p].pre = 0; head = p; //换头 } else if(op==2){ if(nxt == n+1) continue; if(pre == 0) head = nxt; //换头 else a[pre].next = nxt; a[nxt].pre = pre; a[end].next = p; a[p].next = n+1; a[p].pre = end; end = p;//换尾 } else { int q; scanf("%d",&q); if(a[q].next == p|| p==q) continue; if(pre == 0) { //换头 head = nxt; a[head].pre = 0; } if(nxt == n+1) { //换尾 end = pre; a[end].next = n+1; } if(q == end) end = p; a[nxt].pre = pre; a[pre].next = nxt; a[p].next = a[q].next; a[p].pre = q; a[a[q].next].pre = p; a[q].next = p; } } for(int i=1; i<=n; i++) { cout<<a[head].data<<" "; head = a[head].next; } return 0; }
上一题 下一题