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. Localroast使用总结

    全手打原创,转载请标明出处: https://www.cnblogs.com/dreamsqin/p/10883248.html,多谢~=.= 什么是Localroast 一个根据 JSON 文件快速 ...

  2. hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)

    题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...

  3. OpenCV之CvMat、Mat、IplImage之间相互转换实例(转)

    OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数.初学者应该掌握并熟练应用.但是我认为计算机专业学习的方法是,不断的总结并且提炼,同时还要做大量的实践,如编码,才能 ...

  4. 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)

    点此看题面 大致题意: 求出一个矩阵中所有\(n*n\)正方形中极差的最小值. 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维\(RMQ\). 二维\(RMQ\) \(RMQ\)相信大家都 ...

  5. sessionStorage 和 localStorage

    html5 中的 web Storage 包括了两种存储方式:sessionStorage 和 localStorage. sessionStorage 用于本地存储一个会话(session)中的数据 ...

  6. shiro学习记录(二)

    1 在项目中应用shiro框架进行认证 第一步:引入shiro框架相关的jar <!-- 引入shiro框架的依赖 --> <dependency> <groupId&g ...

  7. Object类和String类

    Object类 Object类是Java语言中的根类,即所有类的父类. equals方法 返回值类型为:boolean类型 用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较. 例子: ...

  8. Bootstrap 附加导航(Affix)插件

    bootstrap 附加导航(Affix)插件允许某个div元素固定到页面中的某个位置.您可以打开或关闭使用该插件之间进行切换 后续再写

  9. linux分区之ext2,ext3,ext4,gpt

    linux分区之ext2,ext3,ext4,gpt 2013-07-10 12:00:24 标签:ext3 gpt 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...

  10. Vue入门之v-if的使用

    在vue中一些常用的指令都是v-这样的,v-if是vue的一个内部指令,常用于html中 代码 <!DOCTYPE html> html lang="en"> & ...