csu 1329 一行盒子(链表操作)
1329: 一行盒子
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 693 Solved: 134
[Submit][Status][Web
Board]
Description
你有一行盒子,从左到右依次编号为1, 2, 3,…, n。你可以执行四种指令:
1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令)。
2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令)。
3 X Y表示交换盒子X和Y的位置。
4 表示反转整条链。
指令保证合法,即X不等于Y。例如,当n=6时在初始状态下执行1 1 4后,盒子序列为2 3 1 4 5 6。接下来执行2 3 5,盒子序列变成2 1 4 5 3 6。再执行3 1 6,得到2 6 4 5 3 1。最终执行4,得到1 3 5 4 6 2。
Input
输入包含不超过10组数据,每组数据第一行为盒子个数n和指令条数m(1<=n,m<=100,000),以下m行每行包含一条指令。
Output
每组数据输出一行,即所有奇数位置的盒子编号之和。位置从左到右编号为1~n。
Sample Input
6 41 1 42 3 53 1 646 31 1 42 3 53 1 6100000 14
Sample Output
Case 1: 12Case 2: 9Case 3: 2500050000 第一次做这类型的题,真的有蛮坑的,特别是SAWP操作,情况漏考虑就是死循环,唉,做个模板用吧。。。这题两点要注意,一是我们只要在逻辑上面进行翻转
即可,如果是奇数次,那么只要将1操作看成2操作,2操作看成1操作即可。然后最后输出的时候也只要奇数次翻转就从尾部开始算,偶数次就从头部开始算。
swap(x,y)一定要考虑 next[x] = y和next[y] = x两种情况。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
int n,m;
int chi[maxn],pre[maxn]; void init()
{
pre[] = ;
for(int i = ; i <= n; i++)
pre[i] = i - ;
for(int i = n-; i >= ; i--)
chi[i] = i + ;
chi[n] = ;
}
void left(int x,int y){ ///将x 移到y的左边
if(pre[y]==x) return;
int p = pre[x]; //x的父亲节点
pre[chi[x]] = p,chi[p] = chi[x];
p = pre[y],chi[p] = x;
pre[x] = p,chi[x] = y,pre[y] = x;
}
void right(int x,int y){ ///将x移向y的右边
if(chi[y]==x) return;
int p = pre[x]; //x的父亲节点
pre[chi[x]] = p,chi[p] = chi[x];
pre[x] = y,chi[x] = chi[y];
pre[chi[y]] = x,chi[y] = x;
}
void Swap(int x,int y){ ///链表的交换操作
int p1 = pre[x],p2 = pre[y];
int c1 = chi[x],c2 = chi[y];
if(chi[x]==y){
chi[p1]=y,chi[y]=x,chi[x]=c2;
pre[c2]=x,pre[x]=y,pre[y]=p1;
}else if(chi[y]==x){
chi[p2]=x,chi[x]=y,chi[y]=c1;
pre[c1]=y,pre[y]=x,pre[x]=p2;
}else{
chi[p1] = y,pre[y] = p1;
chi[y] = c1,pre[c1] = y;
chi[p2] = x,chi[x] = c2;
pre[c2] = x,pre[x] = p2;
}
}
int main()
{
//freopen("b.in","r",stdin);
//freopen("b.txt","w",stdout);
int op,x,y;
int cnt = ,cas=;
while(scanf("%d %d",&n,&m)!=EOF)
{
init();
cnt = ;
while(m--)
{
scanf("%d",&op);
if(op==) cnt++;
else
{
if(op<&&cnt%==) op = -op;
if(op == )
{
scanf("%d %d",&x,&y);
left(x,y);
}
else if(op == )
{
scanf("%d %d",&x,&y);
right(x,y);
}
else if(op == )
{
scanf("%d %d",&x,&y);
Swap(x,y);
}
} }
long long ans = ;
if(cnt % == ) //翻转了
{
int head;
for(int i = ; i <= n; i++)
if(chi[i] ==)
{
head = i;
break;
}
int f = ;
while(pre[head] != )
{
if(f%==) ans+=head;
head = pre[head];
f++;
}
if(f%==) ans+=head;
}
else
{
int head;
for(int i = ; i <= n; i++)
if(pre[i] == )
{
head = i;
break;
}
int f = ;
while(chi[head] !=)
{
if(f%==) ans+=head;
head = chi[head];
f++;
}
if(f%==) ans+=head;
}
printf("Case %d: %I64d\n",cas++,ans);
}
return ;
}
csu 1329 一行盒子(链表操作)的更多相关文章
- CSU 1329: 一行盒子
1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 740 Solved: 145[Submit][Status][Web Board ...
- csuoj 1329: 一行盒子
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329 1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 12 ...
- CSUOJ 1329 一行盒子(数组模拟链表)
题目:id=1329">http://acm.csu.edu.cn/OnlineJudge/problem.php? id=1329 题意: watermark/2/text/aHR0 ...
- B - 一行盒子
Description 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子 ...
- SWUSTOJ 960A题总结,又完成一个讨厌的题,内含链表操作启发
今天debug了一个nice代码,先码在这里,SWUST OJ960 双向链表的操作问题 1000(ms) 10000(kb) 2994 / 8244 建立一个长度为n的带头结点的双向链表,使得该链表 ...
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏
数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...
- YTU 2620: B 链表操作
2620: B 链表操作 时间限制: 1 Sec 内存限制: 128 MB 提交: 418 解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...
- C# 链表操作
关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...
随机推荐
- 如何在vi中设置tab的长度
在使用vi写python时(其实,不管用什么写python程序时,都要注意),首先要将Tab键的长度设为4,因为使用python编程时,我们是通过缩进来实现作用域的,所以要统一Tab键的长度.具体方法 ...
- Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python
作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...
- 解析C#彩色图像灰度化算法的实现代码详解
http://www.jb51.net/article/37067.htm public static Bitmap MakeGrayscale(Bitmap original) { ...
- git使用笔记(十三)ls-files
By francis_hao Mar 18,2018 git ls-fles 显示index和工作区的文件的信息. 概要 git ls-files [-z] [-t] [-v] ...
- bzoj 1003 最短路+dp
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8249 Solved: 3464[Submit][Stat ...
- Rabbitmq -- rpc
一.前言 MQ本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发送到RabbitMQ后不会知道消费者(C)处理成功或者失败(甚至连有没有消费者来处理这条消息都不知道).但实际的应用场景中 ...
- 一元回归_R相关系数_多重检验
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- 2017 国庆湖南Day2
期望得分:100+30+100=230 实际得分:100+30+70=200 T3 数组开小了 ..... 记录 1的前缀和,0的后缀和 枚举第一个1的出现位置 #include<cstdio& ...
- Codeforces 148 D Bag of mice
D. Bag of mice http://codeforces.com/problemset/problem/148/D time limit per test 2 seconds memory l ...
- 教你Snapseed软件八个常用调图工具
教你Snapseed软件八个常用调图工具 教你Snapseed(指划修图)软件八个常用调图工具 老阿·编写 Snapseed是目前手机摄影修图中功能最强大的一款软件,很多功能很像电脑用的Photosh ...