Problem B Boxes in a Line
手写链表。。其实很简单的。。。。
注:对相邻的元素需要特判。。。。。
Problem B
Boxes in a Line
You have n boxes in a line on the table numbered 1~n from left to right. Your task is to simulate 4 kinds of commands:
- 1 X Y: move box X to the left to Y (ignore this if X is already the left of Y)
- 2 X Y: move box X to the right to Y (ignore this if X is already the right of Y)
- 3 X Y: swap box X and Y
- 4: reverse the whole line.
Commands are guaranteed to be valid, i.e. X will be not equal to Y.
For example, if n=6, after executing 1 1 4, the line becomes 2 3 1 4 5 6. Then after executing 2 3 5, the line becomes 2 1 4 5 3 6. Then after executing 3 1 6, the line becomes 2 6 4 5 3 1. Then after executing 4, then line becomes 1 3 5 4 6 2
Input
There will be at most 10 test cases. Each test case begins with a line containing 2 integers n, m(1<=n, m<=100,000). Each of the following m lines contain a command.
Output
For each test case, print the sum of numbers at odd-indexed positions. Positions are numbered 1 to n from left to right.
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
Output for the Sample Input
Case 1: 12
Case 2: 9
Case 3: 2500050000
The Ninth Hunan Collegiate Programming Contest (2013)
Problemsetter: Rujia Liu
Special Thanks: Feng Chen, Md. Mahbubul Hasan
#include <iostream>
#include <cstdio>
#include <cstring> #define toleft p
#define toright p^1 using namespace std; const int INF=0x3f3f3f3f;
typedef long long int LL; int lian[][],n,m,p; void Init()
{
p=;
for(int i=;i<=n;i++)
{
lian[i][]=i-;
lian[i][]=i+;
}
lian[][toleft]=INF;
lian[][toright]=;
lian[n+][toleft]=n;
lian[n+][toright]=INF;
} void cmdfour()
{
p=p^;
} void cmdone(int x,int y)
{
int xl=lian[x][toleft],xr=lian[x][toright];
int yl=lian[y][toleft],yr=lian[y][toright]; if(xr==y) return; lian[xl][toright]=xr;
lian[xr][toleft]=xl; lian[x][toright]=y;
lian[x][toleft]=yl; lian[yl][toright]=x;
lian[y][toleft]=x;
} void cmdtwo(int x,int y)
{
int xl=lian[x][toleft],xr=lian[x][toright];
int yl=lian[y][toleft],yr=lian[y][toright]; if(xl==y) return; lian[xl][toright]=xr;
lian[xr][toleft]=xl; lian[x][toleft]=y;
lian[x][toright]=yr; lian[y][toright]=x;
lian[yr][toleft]=x;
} void cmdthree(int x,int y)
{
int xl=lian[x][toleft],xr=lian[x][toright];
int yl=lian[y][toleft],yr=lian[y][toright]; if(xr!=y&&xl!=y)
{
lian[x][toleft]=yl;
lian[x][toright]=yr;
lian[yl][toright]=x;
lian[yr][toleft]=x; lian[y][toleft]=xl;
lian[y][toright]=xr;
lian[xl][toright]=y;
lian[xr][toleft]=y;
}
else
{
if(xr==y)
{
lian[x][toright]=yr;
lian[x][toleft]=y; lian[y][toright]=x;
lian[y][toleft]=xl; lian[xl][toright]=y;
lian[yr][toleft]=x;
}
else if(xl==y)
{
lian[x][toleft]=yl;
lian[x][toright]=y; lian[y][toleft]=x;
lian[y][toright]=xr; lian[xr][toleft]=y;
lian[yl][toright]=x;
} }
} LL getSum()
{
LL ans=;
int cnt=,pos=;
if(n%==||p==)
{
if(p) p=;
while(true)
{
if(cnt&) ans+=(LL)lian[pos][toright];
pos=lian[pos][toright];
cnt++;
if(cnt>=n+) break;
}
}
else if(p==)
{
if(p) p=;
while(true)
{
if(cnt%==) ans+=(LL)lian[pos][toright];
pos=lian[pos][toright];
cnt++;
if(cnt>=n+) break;
}
}
return ans;
} int main()
{
int cas=,cmd,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
Init(); while(m--)
{
scanf("%d",&cmd);
if(cmd==)
{
scanf("%d%d",&x,&y);
cmdone(x,y);
}
else if(cmd==)
{
scanf("%d%d",&x,&y);
cmdtwo(x,y);
}
else if(cmd==)
{
scanf("%d%d",&x,&y);
cmdthree(x,y);
}
else if(cmd==)
{
cmdfour();
}
}
LL ans=getSum();
printf("Case %d: %lld\n",cas++,ans);
}
return ;
}
Problem B Boxes in a Line的更多相关文章
- Boxes in a Line
Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...
- uva-12657 - Boxes in a Line(双向链表)
12657 - Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to righ ...
- Boxes in a Line(移动盒子)
You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to sim ...
- C - Boxes in a Line 数组模拟链表
You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simul ...
- UVa 12657 Boxes in a Line(应用双链表)
Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...
- Boxes in a Line UVA - 12657
You have n boxes in a line on the table numbered 1...n from left to right. Your task is to simulat ...
- UVA 12657 Boxes in a Line 双向链表
题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47066 利用链表换位置时间复杂度为1的优越性,同时也考虑到使用实际 ...
- Boxes in a Line UVA - 12657 (双向链表)
题目链接:https://vjudge.net/problem/UVA-12657 题目大意:输入n,m 代表有n个盒子 每个盒子最开始按1~n排成一行 m个操作, 1 x y :把盒子x放到y ...
- 2019 SCUT SE 新生训练第四波 L - Boxes in a Line——双向链表
先上一波题目 https://vjudge.net/contest/338760#problem/L 这道题我们维护一个双向链表 操作1 2 3 都是双向链表的基本操作 4操作考虑到手动将链表反转时间 ...
随机推荐
- IDEA新建MAVEN项目时速度缓慢
原因 IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令执行时,需要指定一个archetype-catalog.xml文件. 该命令的 ...
- 【Alpha版本】 第八天 11.16
一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 完成我要应聘的列表显示,完成账户信息设置界面 完成我要应聘的详情显 ...
- iOS - 沙盒规范
1.模拟器沙盒目录文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library. 因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件 ...
- photoshop切图介绍
第一部分:界面设置 1.点击“文件-新建”(或者ctrl+n)打开一个新建对话框.名称可随意填写.“预设”设置为自定,“宽度”一般选择1920,“单位”选为像素.“高度”可选择为2000,“单位”选为 ...
- java编程思想-java中的并发(四)
五. 新类库中的构件 Java SE5的java.util.concurrent引入了大量设计用来解决并发问题的新类.学习使用它们将有助于编写出更加简单而强壮的并发程序. 1. CountDownLa ...
- spring-boot-note
1 java配置和注解配置相结合,不需要任何的xml配置即可 2 spring tool suite 3 src/main/resources/banner.txt http://patorjk.co ...
- Java数据结构——哈希表
- JSP EL表达式
1 EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- 开源License
http://www.open-open.com/bbs/view/1319816219625 http://my.oschina.net/yangsheng/blog/190917
- 如何用Nsight调试C# OpenGL程序
https://devtalk.nvidia.com/default/topic/804306/nsight-visual-studio-edition/nsight-4-5-can-t-debug- ...