CSU-1982 小M的移动硬盘
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的移动硬盘的更多相关文章
- csu 1982:小M的移动硬盘(双向链表)
Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦? 小M最终决定要把 ...
- CSUOJ 1982 小M的移动硬盘
Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦?小M最终决定要把这 ...
- CSU 1802 小X的战斗力【拓扑dp】
题目链接 题意:n个人,每个人有一个能力值.给出m组关系A, B, 表示A的能力值大于B的能力值. 问:m组关系中是否有自相矛盾的?若不矛盾,问:第1个人在所有人的能力值中排名第几?有多少人的能力值的 ...
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- KVM客户机使用主机USB设备
有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持 -usbdevice devname 为客户机增加usb设备,devn ...
- kvm云主机使用宿主机usb设备
有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持-usbdevice devname 为客户机增加usb设备,devna ...
- CSU 1777: 大还是小?【模拟/后导0】
293419 roniking 1777 Accepted 2032 0 C++ 2000 2018-04-03 19:21:25 Description 输入两个实数,判断第一个数大,第二个数大还是 ...
- csu 1976: 搬运工小明
1976: 搬运工小明 Submit Page Summary Time Limit: 2 Sec Memory Limit: 128 Mb Submitted: 94 ...
- mount 移动硬盘出现的各种小问题
1.fdisk -l 查看硬盘是否存在 2.新建要挂载硬盘的文件夹 mkdir /disk (如果想要挂载到已存在的目录就不要新建了) 3.挂载硬盘:mount /dev/sdc /disk 4 ...
随机推荐
- javascript字符串格式化string.format
String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, fu ...
- sublime相关小技巧
1.快速建立一个新文件:Ctrl+n 2.修改多个相同符号:Ctrl+D 3.建立语言后缀的文件保存,例如我想创建PHP的语言脚本,先按Ctrl+Shift+p,打开Command Palette,输 ...
- UVALive 4987 EvacuationPlan(dp,贪心)
在所有避难所都有至少一只队伍的情况,总移动距离最小. 把队伍的位置和人都排序. 会发现,对于最后一个队伍i和最后一个避难所j, Case 1:pos[j]>=pos[i],那么i是距离j最近的一 ...
- TypeScript task
Ctrl+Shift+B 生成 js 文件.
- 如何更改VirtualBox虚拟电脑内存大小
- 借鉴一些关于js框架的东西
八款Js框架介绍及比较,Dojo .Scriptaculous .Prototype .yui-ext .Jquery .Mochikit.mootools .moo.fx,componentartu ...
- 对mysql快速批量修改,查重
更新UPDATE mytable SET myfield = CASE id WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value' E ...
- java基础面试题:写clone()方法时,通常都有一行代码,是什么?
clone()方法 与new constructor()构造器创建对象不同 是克隆一个新的对象 package com.swift; public class Clone_Test { public ...
- 人品计算器 JFrame 窗体软件版 JPanel JTextField JTextArea JButtton JLabel setContentPane Swing包(用户界面工具包)
import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.eve ...
- ASIHTTPRequest的使用
本文转自csdn ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中. ...