CSU 1329: 一行盒子
1329: 一行盒子
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 740 Solved: 145
[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 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
难点在于第四种操作,第四种操作是反转,效果是前后继交换了,其实根本不需要操作,只需记录反转的 次数就行了。反转次数为奇数时,
flag=1的操作变成flag=2的操作,flag=2的操作变成flag=1的操作,其他的不变。
因为反转后,一个数的前面变成后面,后面变成前面。还有就是构成环,方便找到起点和终点。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
int *tmp1,*tmp2;
const int N = 1e5+;
int LEFT[N],RIGHT[N];
void swap(int a,int b)
{
RIGHT[a] = b;
LEFT[b] = a;
}
int main()
{
int cas = ;
int T,cnt,nest,flag,m,n,x,y;
while(~scanf("%d %d",&m,&n))
{
for(int i=;i<=m;i++)//预处理
{
LEFT[i] = i-;
RIGHT[i] = i+;
}
RIGHT[m] = ;
cnt = ;
while(n--)
{
scanf("%d",&flag);
if(flag != ) scanf("%d %d",&x,&y);
else cnt++;
if((cnt&) && flag<) flag = - flag;
if(flag == && LEFT[y]!=x)
{
swap(LEFT[x],RIGHT[x]);
swap(LEFT[y],x);
swap(x,y);
}
else if(flag == && RIGHT[y]!=x)
{
swap(LEFT[x],RIGHT[x]);
swap(x,RIGHT[y]);
swap(y,x);
}
else if(flag == )
{
if(RIGHT[x] == y)//两者在挨着;
{
swap(LEFT[x],y);
swap(x,RIGHT[y]);
swap(y,x);
}
else if(LEFT[x] == y)
{
swap(LEFT[y],x);
swap(y,RIGHT[x]);
swap(x,y);
}
else
{
int t1 = LEFT[x],t2 = RIGHT[x],t3 = LEFT[y],t4 = RIGHT[y];
swap(t1,y);
swap(y,t2);
swap(t3,x);
swap(x,t4); }
}
}
long long ans = ;
if(cnt&) //翻转一下
{
tmp2 = RIGHT;
tmp1 = LEFT;
}
else {
tmp2 = LEFT;
tmp1 = RIGHT;
}
for(int i=;i<=m;i++)
{
if(tmp2[i] == )//寻找第一位
{
for(int k=;i;i = tmp1[i],k++)
if(k&) ans = ans+i;
printf("Case %d: %lld\n",cas++,ans);
break;
}
}
}
return ;
}
CSU 1329: 一行盒子的更多相关文章
- csu 1329 一行盒子(链表操作)
1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 693 Solved: 134 [Submit][Status][Web Boa ...
- 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表示把盒子 ...
- 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布局来说 ...
随机推荐
- [Java基础] Java对象内存结构
转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的 ...
- Cisco路由技术基础知识详解
第一部分 请写出568A的线序(接触网络第一天就应该会的,只要你掐过,想都能想出来) .网卡MAC地址长度是( )个二进制位(16进制与2进制的换算关系,只是换种方式问,不用你拿笔去算) A.12 ...
- 支持向量机SVM 简要推导过程
SVM 是一块很大的内容,网上有写得非常精彩的博客.这篇博客目的不是详细阐述每一个理论和细节,而在于在不丢失重要推导步骤的条件下从宏观上把握 SVM 的思路. 1. 问题由来 SVM (支持向量机) ...
- iOS:UIView、UIControl、UIButton、UILabel简单的属性和方法常识
常见属性和方法 一 .UIVIew 常见属性 1.frame 位置和尺寸(以父控件的左上角为原点(0,0)) 2.center 中点 (以父控件的左上角为原点(0,0)) 3.bounds 位置和尺寸 ...
- cc攻击技术
攻击者借助代理服务器生成指向受害主机的合法请求,实现DOS,和伪装就叫:cc(ChallengeCollapsar). CC主要是用来攻击页面的.大家都有这样的经历,就是在访问论坛时,如果这个论坛比较 ...
- 把文章里边的html标签去掉(去掉文字的样式,显示css设置的样式)
java: validHeasers.add(tr[0].replace("<(.[^>]*)>",""));//去除HTML标签
- python fabric使用 http://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html
fab -u username -p password -H hostname -P -- cmd 或root@'hostname' -H多个主机是引号用逗号隔开 -P异步
- CopyOnWriteArrayList操作java.lang.UnsupportedOperationException
问题一:CopyOnWriteArrayList不能强制转换成ArrayList 解决的方法:将CopyOnWriteArrayList传入ArrayList中 ArrayList<T> ...
- ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
产生这个的原因可能是由于数据库突然停止,没有来得及将缓存区中的LOG归档,导致下次开启时不能匹配日志文件. 数据库中的三个日志文件挨个试,第二个就匹配上了
- Python-常用库扩展
图片处理: PIL HTTP请求模拟: requests