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. 微信小程序(底部导航的实现)

    详情请看官方文档介绍: https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html 在根目录配置文件app.json中配置底部导航: ...

  2. 免费的freedns实现动态域名和url转发

    路由器的固件是dd-wrt 到freedns.afraid.org上注册一个动态域名,如果默认的端口无法使用80,需要配置二级域名的url转发功能. 实测2个月很稳定. 另外为了防止主机ip地址更新频 ...

  3. 解决MVC运行controller的时候只有有参构造函数但是程序一定要走无参构造函数的方法

    方法如下 https://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be

  4. Linux下bash的快捷键

    Ctrl + A  :切换到命令行开始 Ctrl + E :切换到命令行末尾 Ctrl + L : 清屏,相当于clear Ctrl + U :清除剪切光标前的内容 Ctrl + K :剪切清除光标后 ...

  5. geoNear查询 near查询的升级版

    geoNear查询可以看作是near查询点进化版 geoNear查询使用runCommand命令进行使用,常用使用如下: db.runCommand({ geoNear:<collection& ...

  6. python脚本执行报错:SyntaxError: Non-ASCII character '\xe6' in file ip.py on line 4...

    报错信息 [root@chenbj ~]# python ip.py 192.168.1.1 File "ip.py", line 4 SyntaxError: Non-ASCII ...

  7. python_57_高阶函数

    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(a,b,f): return f(a)+f(b) res=add(-3,- ...

  8. python读取txt写入txt

    http://www.cnblogs.com/allenblogs/archive/2010/09/13/1824842.html

  9. windows下安装python的包管理工具pip,scikit-learn

    打开https://pip.pypa.io/en/latest/installing.html#python-os-support 下载pip-get.py 进入python,执行pip-get.py ...

  10. SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...