http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329

1329: 一行盒子

Time Limit: 1 Sec  Memory Limit: 128 MB

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 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4

Sample Output

Case 1: 12
Case 2: 9
Case 3: 2500050000

HINT

 

Source

湖南省第九届大学生计算机程序设计竞赛

分析:

这道题可以用链表实现,也可以用两个数组模拟。

  难点在于第四种操作,第四种操作是反转,效果是前后交换了,其实根本不需要操作,只需记录反转的 次数就行了。

反转次数为奇数时,flag=1的操作变成flag=2的操作,flag=2的操作变成flag=1的操作,其他的不变。

AC代码:

 #include"stdio.h"
#include"string.h"
const int ms=;
int left[];
int right[];
int *tmp1,*tmp2;
inline void link(int a,int b)
{
right[a]=b;
left[b]=a;
}
int main()
{
int n,m,i,j,k,flag,x,y,p=,cnt,next;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=;i<=n;i++)
{
left[i]=i-;
right[i]=i+;
}
right[n]=;//构成环,方便寻找开始节点和结束节点
cnt=;
while(m--)
{
scanf("%d",&flag);
if(flag!=)
scanf("%d%d",&x,&y);
else
cnt++;
if((cnt&)&&flag<)
flag=-flag;
if(flag==&&(right[x]!=y))
{
if(right[y]==x)
{
int t1=left[x],t2=right[x],t3=left[y],t4=right[y];
link(t3,x);
link(x,y);
link(y,t2);
}
else
{
link(left[x],right[x]);
link(left[y],x);
link(x,y);
}
}
else if(flag==&&right[y]!=x)
{
if(right[x]==y)
{
int t1=left[x],t2=right[x],t3=left[y],t4=right[y];
link(t1,y);
link(y,x);
link(x,t4);
}
else
{
link(left[x],right[x]);
link(x,right[y]);
link(y,x);
}
}
else if(flag==)
{
if(right[x]==y)
{
int t1=left[x],t2=right[x],t3=left[y],t4=right[y];
link(t1,y);
link(y,x);
link(x,t4);
}
else if(right[y]==x)
{
int t1=left[x],t2=right[x],t3=left[y],t4=right[y];
link(t3,x);
link(x,y);
link(y,t2);
}
else{
int t1=left[x],t2=right[x],t3=left[y],t4=right[y];
link(t1,y);
link(y,t2);
link(t3,x);
link(x,t4);
}
}
}
long long ans=;
if(cnt&)
{
tmp2=right;
tmp1=left;
}
else
{
tmp2=left;
tmp1=right;
}
for(i=;i<=n;i++)
{
if(tmp2[i]==)
{
for(k=;i;i=tmp1[i],k++)
if(k&)
ans+=i;
printf("Case %d: %lld\n",p++,ans);
break;
}
}
}
return ;
}

因为反转后,一个数的前面变成后面,后面变成前面。还有就是构成环,方便找到起点和终点。

csuoj 1329: 一行盒子的更多相关文章

  1. CSUOJ 1329 一行盒子(数组模拟链表)

    题目:id=1329">http://acm.csu.edu.cn/OnlineJudge/problem.php? id=1329 题意: watermark/2/text/aHR0 ...

  2. csu 1329 一行盒子(链表操作)

    1329: 一行盒子 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 693  Solved: 134 [Submit][Status][Web Boa ...

  3. CSU 1329: 一行盒子

    1329: 一行盒子 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 740  Solved: 145[Submit][Status][Web Board ...

  4. B - 一行盒子

    Description 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子 ...

  5. CSUOJ1329——一行盒子_湖南省第九届大学生计算机程序设计竞赛

    题目是中文的我就不是说明了,比赛的时候看过题目后队友说是splay来做,细想来省赛不会出这么坑的题目吧. 于是比赛还有一个小时左右把该做的都做完了以后,我们队三个人都来思考这个题目了.不过还好很快我们 ...

  6. COJ 0018 移动盒子

    20605移动盒子 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 你有一行盒子,从左到右依次编号为1,2,3,……,n.可以执 ...

  7. Uva 12657 移动盒子(双向链表)

    题意: 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.可以执行以下4种指令:1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右 ...

  8. UVa12657 - Boxes in a Line(数组模拟链表)

    题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...

  9. 比float更好的页面布局inline-block

    一:页面布局的发展过程 桌格设计 表格+css div+css的浮动布局 div+css的内联块布局 二:流行多年的浮动布局的优劣 优势: div+css浮动布局的优势,主要是相对于table布局来说 ...

随机推荐

  1. String作为方法参数传递 与 引用传递

    String作为方法参数传递 String 和 StringBuffer的区别见这里: http://wenku.baidu.com/view/bb670f2abd64783e09122bcd.htm ...

  2. extjs4 树列表 添加子节点 刷新所有父节点数据

    itemclick:function(view, record, item,index){console.log(record.parentNode) for(pNode = record.paren ...

  3. JBPM TaskInstance 对象创建过程

    对象获得过程如下: 获得对象工厂--->工厂创建代理对象 TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance(); TaskI ...

  4. 【重要】ASCII码表

    我们在做业务项目,客户端的输入总是无法控制,有各种各样的特殊字符,这些特殊字符就要借助ASCII码表才能判断,所以我做了一张图,方便查看 为什么要搞个表出来,下面的字符串中,你看看你能否看的出来是什么 ...

  5. HTML5的新事件

    HTML 元素可拥有事件属性,这些属性在浏览器中触发行为,比如当用户单击一个 HTML 元素时启动一段 JavaScript. HTML 元素可拥有事件属性,这些属性在浏览器中触发行为,比如当用户单击 ...

  6. Java高级之虚拟机加载机制

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1.0版本:2016-05-21 SubClass!! 执行结果说明一个问题:子类调用父类变量的时候 ...

  7. Windows下Memcache的安装与在php中使用

    memcache dll插件和测试例子下载地址: http://pecl.php.net/package/memcache Windows下Memcache的安装方法 Memcached官方:http ...

  8. PMP--案例解答要点

    没有相关的管理流程或方针: 没有进行良好的策划: 资源不足(人.资金.设备和工具): 缺少培训,不具备相关的知识和技能要求: 项目干系人识别不充分,干系人没有充分的介入: 缺少配置管理.变更控制和版本 ...

  9. js判断手机访问web网站跳转到手机版

    第一种:直接JS脚本 <script type="text/javascript">try {var urlhash = window.location.hash;if ...

  10. busybox rx 命令

    rx命令使用xmodem传送文件,只需要串口线就传送. 在文件系统输入如下命令,传送文件到板子上,板子上保存文件的名称为file rx file 在secureCRT中选择Transfer->S ...