CSU-1982 小M的移动硬盘

Description

最近小M买了一个移动硬盘来储存自己电脑里不常用的文件。但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦?

小M最终决定要把这些文件好好归类,把同一类地移动到一起。所以现在小M有了这几种操作:

1 u 表示把编号为u的文件放到最上面

2 u 表示把编号为u的文件放到最下面

3 u v 表示把编号为u的文件放到编号为v的文件的后面

已知在最开始的时候,1号文件到n号文件从上往下排布

现在小M已经给出了他所进行的所有操作,你能告诉他操作之后的序列是会变成什么样子吗?

Input

第一行为一个数字T(T<=10)表示数据组数

第二行为两个数字n、m(1<=n,m<=300000)表示序列长度和小M的操作次数

接下来m行每行两个或三个数字,具体含义见题面

保证数据合法

Output

输出一行表示小M操作结束后的序列

Sample Input

1
10 5
1 5
2 3
2 6
3 4 8
3 1 3

Sample Output

5 2 7 8 4 9 10 3 1 6

题解

也是一道水题,但却WA了很多发,这题用数组模拟双向链表即可,先贴一开始WA的代码

#include<bits/stdc++.h>
#define maxn 300050
using namespace std;
struct node {
int l, r;
} a[maxn];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
a[i].l = i - 1;
a[i].r = i + 1;
}
int head = 1, tail = n;
for (int i = 1; i <= m; i++) {
int q;
scanf("%d", &q);
if (q == 1) {
int x;
scanf("%d", &x);
if (x == head) continue;
if (x == tail) tail = a[x].l;
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[head].l = x;
a[x].l = 0;
a[x].r = head;
head = x;
}
if (q == 2) {
int x;
scanf("%d", &x);
if (x == tail) continue;
if (x == head) head = a[x].r;
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[tail].r = x;
a[x].l = tail;
a[x].r = n + 1;
tail = x;
}
if (q == 3) {
int x, y;
scanf("%d%d", &x, &y);
if (x == y) continue;
if (x == head) {
head = a[x].r;
}
if (y == tail) {
tail = x;
}
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[x].r = a[y].r;
a[a[y].r].l = x;
a[x].l = y;
a[y].r = x;
}
}
int now = head;
for (int i = 1; i < n; i++) {
printf("%d ", now);
now = a[now].r;
}
printf("%d\n", now);
}
return 0;
}
/**********************************************************************
Problem: 1982
User: Artoriax
Language: C++
Result: WA
**********************************************************************/

这个代码只有一点没注意到,即在q==3时,x处于tail时也会导致tail变化,很容易想的一个点,但却WA了很多次,然后去网上搜题解,用a[0]表示链表头,用a[n + 1]表示表尾才AC, 之后对拍一发才发现这个愚蠢的错误。


网上题解版:

#include<bits/stdc++.h>
#define maxn 300050
using namespace std;
struct node {
int l, r;
} a[maxn];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
a[i].l = i - 1;
a[i].r = i + 1;
}
a[0].r = 1;
a[n + 1].l = n;
for (int i = 1; i <= m; i++) {
int q;
scanf("%d", &q);
if (q == 1) {
int x;
scanf("%d", &x);
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[x].l = 0;
a[x].r = a[0].r;
a[a[0].r].l = x;
a[0].r = x;
}
if (q == 2) {
int x;
scanf("%d", &x);
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[x].r = n + 1;
a[x].l = a[n + 1].l;
a[a[n + 1].l].r = x;
a[n + 1].l = x;
}
if (q == 3) {
int x, y;
scanf("%d%d", &x, &y);
if (x == y) continue;
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[x].r = a[y].r;
a[a[y].r].l = x;
a[x].l = y;
a[y].r = x;
}
}
int now = a[0].r;
for (int i = 1; i < n; i++) {
printf("%d ", now);
now = a[now].r;
}
printf("%d\n", now);
}
return 0;
}
/**********************************************************************
Problem: 1982
User: Artoriax
Language: C++
Result: AC
Time:556 ms
Memory:4368 kb
**********************************************************************/

自己改正版:

#include<bits/stdc++.h>
#define maxn 300050
using namespace std;
struct node {
int l, r;
} a[maxn];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
a[i].l = i - 1;
a[i].r = i + 1;
}
int head = 1, tail = n;
for (int i = 1; i <= m; i++) {
int q;
scanf("%d", &q);
if (q == 1) {
int x;
scanf("%d", &x);
if (x == head) continue;
if (x == tail) tail = a[x].l;
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[head].l = x;
a[x].l = 0;
a[x].r = head;
head = x;
}
if (q == 2) {
int x;
scanf("%d", &x);
if (x == tail) continue;
if (x == head) head = a[x].r;
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[tail].r = x;
a[x].l = tail;
a[x].r = n + 1;
tail = x;
}
if (q == 3) {
int x, y;
scanf("%d%d", &x, &y);
if (x == y) continue;
if (a[y].r == x) continue;
if (x == head) {
head = a[x].r;
}
if (x == tail) {
tail = a[x].l;
}
if (y == tail) {
tail = x;
}
a[a[x].l].r = a[x].r;
a[a[x].r].l = a[x].l;
a[x].r = a[y].r;
a[a[y].r].l = x;
a[x].l = y;
a[y].r = x;
}
}
int now = head;
for (int i = 1; i < n; i++) {
printf("%d ", now);
now = a[now].r;
}
printf("%d\n", now);
}
return 0;
}
/**********************************************************************
Problem: 1982
User: Artoriax
Language: C++
Result: AC
Time:560 ms
Memory:4368 kb
**********************************************************************/

CSU-1982 小M的移动硬盘的更多相关文章

  1. csu 1982:小M的移动硬盘(双向链表)

    Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦? 小M最终决定要把 ...

  2. CSUOJ 1982 小M的移动硬盘

    Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦?小M最终决定要把这 ...

  3. CSU 1802 小X的战斗力【拓扑dp】

    题目链接 题意:n个人,每个人有一个能力值.给出m组关系A, B, 表示A的能力值大于B的能力值. 问:m组关系中是否有自相矛盾的?若不矛盾,问:第1个人在所有人的能力值中排名第几?有多少人的能力值的 ...

  4. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  5. KVM客户机使用主机USB设备

    有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持 -usbdevice devname 为客户机增加usb设备,devn ...

  6. kvm云主机使用宿主机usb设备

    有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持-usbdevice devname 为客户机增加usb设备,devna ...

  7. CSU 1777: 大还是小?【模拟/后导0】

    293419 roniking 1777 Accepted 2032 0 C++ 2000 2018-04-03 19:21:25 Description 输入两个实数,判断第一个数大,第二个数大还是 ...

  8. csu 1976: 搬运工小明

    1976: 搬运工小明 Submit Page   Summary   Time Limit: 2 Sec     Memory Limit: 128 Mb     Submitted: 94     ...

  9. mount 移动硬盘出现的各种小问题

    1.fdisk -l 查看硬盘是否存在 2.新建要挂载硬盘的文件夹 mkdir  /disk   (如果想要挂载到已存在的目录就不要新建了) 3.挂载硬盘:mount /dev/sdc /disk 4 ...

随机推荐

  1. Python之HTML的解析(网页抓取一)

    http://blog.csdn.net/my2010sam/article/details/14526223 --------------------- 对html的解析是网页抓取的基础,分析抓取的 ...

  2. pta 编程题12 堆中的路径

    其它pta数据结构编程题请参见:pta 这道题考察的是最小堆. 堆是一个完全二叉树,因此可用数组表示,一个下标为 i 的结点的父节点下标为 i / 2,子结点下标为 2i 和 2i + 1. 插入元素 ...

  3. 【洛谷1337】[JSOI2004] 吊打XXX(模拟退火经典题)

    点此看题面 大致题意: 一个平面上有\(n\)个点,每个点有1个权值,现在要选择平面上的一个点,使这\(n\)个点的权值乘上到达选定点的距离之和最小. 模拟退火 我们可以用模拟退火来做这道题. 先将\ ...

  4. Excel自动从身份证中提取生日、性别、年龄

    现在学生的身份证号已经全部都是18位的新一代身份证了,里面的数字都是有规律的.前6位数字是户籍所在地的代码,7-14位就是出生日期.第17位“2”代表的是性别,偶数为女性,奇数为男性.我们要做的就是把 ...

  5. leetcode - 二叉树最大深度

    二叉树最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,nul ...

  6. 博学谷-数据分析matplotlib

    博学谷-数据分析 python数学学科的基础 机器学习课程的基础 1.1 介绍 1.2 jupyter和conda 1.3 matplotlib from matplotlib import pypl ...

  7. 洛谷P3374树状数组1

    下有彩蛋(from https://www.cnblogs.com/wuwangchuxin0924/p/5921130.html)树状数组的blog写的最好的是这位//https://www.cnb ...

  8. 4-8 string

    1.常用的string模块 import string # 26个小写字母 print(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz # 2 ...

  9. jQuery具体实例介绍什么时候用ajax,ajax应该在什么地方使用

    网站开发时,ajax是一个非常方便的工具,它具有和表单相同的功能完成前端和后台之间的交互!它起到局部刷新的功能!那什么时候用ajax呢?下面给大家介绍几个实例,首先应该分为两类:  一.在用表单和aj ...

  10. python 爬虫豆瓣top250

    网页api:https://movie.douban.com/top250?start=0&filter= 用到的模块:urllib,re,csv 捣鼓一上午终于好了,有些小问题 (top21 ...