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操作考虑到手动将链表反转时间 ...
随机推荐
- SSH使用密钥登录并禁止口令登录实践
生成PublicKey Linux:ssh-keygen -t rsa[私钥 (id_rsa) 与公钥 (id_rsa.pub)]Windows:SecurCRT/Xshell/PuTTY[SSH-2 ...
- django redis VS memcache 区别简介
https://www.v2ex.com/t/142644 http://stackoverflow.com/questions/10558465/memcached-vs-redis 简单来说: r ...
- 【Alpha版本】 第五天 11.11
一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 周末+下周一要做任务 问题困难 心得体会 胡泽善 完成了账户信息修改界面 完成管理员的三大界面框架.完成管理 ...
- 如何写出优雅的css代码 ?
如何写出优雅的css代码 ? 对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于 ...
- How to set up an FTP server on Ubuntu 14.04
How to set up an FTP server on Ubuntu 14.04 Setting up a fully-functional and highly secure FTP serv ...
- c语言程序
汇编语言嵌入到c语言中 #include<stdio.h> int main(void) { int a,b,c; a=4; b=5; _asm { mov eax,a; add eax, ...
- JQuery------$.ajax()的使用方法
菜鸟教程地址: http://www.runoob.com/jquery/ajax-ajax.html html(../Home/Index.cshtml) <body> <butt ...
- JavaWeb学习笔记——表达式语言
使用表达式语言,可以方便地访问标志位(JSP中有page(pageContext).request.session和application4种标志位)中的属性内容,可以避免出现许多的Scriptlet ...
- jQuery学习笔记——弹出对话框
引用jQuery库文件的<script>标签,必须放在引用自定义脚本文件的<script>标签之前.否则,在编写的代码中将不能引用到jQuery框架 <script ty ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...