csuoj 1329: 一行盒子
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: 一行盒子的更多相关文章
- CSUOJ 1329 一行盒子(数组模拟链表)
题目:id=1329">http://acm.csu.edu.cn/OnlineJudge/problem.php? id=1329 题意: watermark/2/text/aHR0 ...
- csu 1329 一行盒子(链表操作)
1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 693 Solved: 134 [Submit][Status][Web Boa ...
- CSU 1329: 一行盒子
1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 740 Solved: 145[Submit][Status][Web Board ...
- B - 一行盒子
Description 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子 ...
- CSUOJ1329——一行盒子_湖南省第九届大学生计算机程序设计竞赛
题目是中文的我就不是说明了,比赛的时候看过题目后队友说是splay来做,细想来省赛不会出这么坑的题目吧. 于是比赛还有一个小时左右把该做的都做完了以后,我们队三个人都来思考这个题目了.不过还好很快我们 ...
- COJ 0018 移动盒子
20605移动盒子 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 你有一行盒子,从左到右依次编号为1,2,3,……,n.可以执 ...
- Uva 12657 移动盒子(双向链表)
题意: 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.可以执行以下4种指令:1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右 ...
- UVa12657 - Boxes in a Line(数组模拟链表)
题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...
- 比float更好的页面布局inline-block
一:页面布局的发展过程 桌格设计 表格+css div+css的浮动布局 div+css的内联块布局 二:流行多年的浮动布局的优劣 优势: div+css浮动布局的优势,主要是相对于table布局来说 ...
随机推荐
- Running Kafka At Scale
https://engineering.linkedin.com/kafka/running-kafka-scale If data is the lifeblood of high technolo ...
- Spring配置文件的读取
1.配置文件的命名 Spring框架中的默认配置文件,建议命名为applicationContext.xml * 编写配置文件,默认位置有两个 ①src目录.②WEB-INF目录 2.Spring 配 ...
- Freemarker的第二次使用~list的元素是数组
在上次初次使用Freemarker作为模版后,我再次使用它.这次的需求是: xml文档的某个节点的属性A和其一个子节点的某个属性B有关联,属性B的值需要随着属性A的值变化.而属性A的值有4个值,现在需 ...
- JSON数据转换为字典型
-(NSDictionary *)parseJSONStringToNSDictionary:(NSString *)JSONString { NSData *JSONData = [JSONS ...
- php判断爬虫
function checkrobot($useragent = ''){ static $kw_spiders = 'Bot|Crawl|Spider|slurp|sohu-search|lycos ...
- 理解tornado
计算密集型:多进程 IO密集型:多线程 能产生IO阻塞的情况很多,比如网络通讯.磁盘读写.当发生阻塞时,CPU是闲置的,此时如果就一个线程就没法处理其他事情了. 所以对于含有IO阻塞的环境,多线程 ...
- Android 代码中文字在手机上显示乱码问题解决方法
在学习Android过程中,用于测试时发现,代码中的中文在真机上会显示乱码, 网上查阅了些资料,参考如下: http://www.androidchina.net/3024.html http://b ...
- 20145211 《Java程序设计》实验报告五————Java网络编程及安全实验报告
实验内容 1.掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 这一部分是与我的partner合作的,详见他的博客- [20145326 <Java程序设计> ...
- MVC中的@Html.DisplayFor如何控制日期的显示格式
在Sql Server中,如果将某字段定义成日期 时间 类型DateTime,那么在视图中会默认显示成年月日时分秒的方式(如 2013/8/6 13:37:33) 如果只想显示成年月日或者其他自定义形 ...
- 从printf("\40d\n")看转义字符
1. 八进制 十进制 十六进制 二进制:0 1 2 3 4 5 6 7 \0(或省略0,\) ,\28 按道理是错误的,但是C语言把它解释为 \2,8错误了就不考虑 十进制:0 1 2 3 ...