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>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...
随机推荐
- Hbase(二)hbase建表
一.建表高级属性 下面几个 shell 命令在 hbase 操作中可以起到很到的作用,且主要体现在建表的过程中,看 下面几个 create 属性 1.bloomfilter 布隆过滤器 默认是 NON ...
- javaweb之request获取referer请求头实现防盗链
package test.request; import java.io.IOException; import javax.servlet.ServletException; import java ...
- 【DP】【CF855C】 Helga Hufflepuff's Cup
Description 给你一个树,可以染 \(m\) 个颜色,定义一个特殊颜色 \(k\) , 要求保证整棵树上特殊颜色的个数不超过 \(x\) 个.同时,如果一个节点是特殊颜色,那么它的相邻节点的 ...
- 前端解放生产力之–动画(Adobe Effects + bodymovin + lottie)
大概很久很久以前,2017年,参加了第二届中国前端开发者大会(FDCon2017),除了看了一眼尤雨溪,印象最深刻的就是手淘渚薰分享的关于H5交互的内容了.时光荏苒,最近再次接触,简单回顾一下. 示例 ...
- POJ2234:Matches Game(Nim博弈)
Matches Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12325 Accepted: 7184 题目链 ...
- Qt ------ 断开某对信号与槽的connect
QMetaObject::Connection dis; dis = connect(this,&TcpSocket::readyRead,this,&TcpSocket::readD ...
- Vue.js随笔二(新建路由+component+添加样式+变量的显示)
创建一个页面: 1.首先让我们看一下整个vue.js的目录,如下图所示: 2.现在让我们创建一个页面吧: 2-1首先你需要新建路由(就和建立一个如何找到项目文件的目录一个意思):进入src/route ...
- codevs 1491 取物品
1491 取物品 http://codevs.cn/problem/1491/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 现在有n个物品(有可能 ...
- 动态规划:插头DP
这种动归有很多名字,插头DP是最常见的 还有基于连通性的动态规划 轮廓线动态规划等等 超小数据范围,网格图,连通性 可能算是状态压缩DP的一种变式 以前我了解的状压DP用于NP难题的小数据范围求解 这 ...
- 本地文件夹如何断开svn连接
最近遇到一个问题,svn的项目down失败,一不小心点了删除准备重新上传,发现本地的文件已有svn源信息,提交更新均报再找不到此文件路径. 于是想着删除此文件夹的svn信息,经过一番百度,以下方法测试 ...