UVA 12657 Boxes in a Line(双向链表+小技巧)
题意:对于一行按照顺序排列盒子数字与位置都为 1,2,3,4....n
执行四种操作
c = 1 x 放到 y 的左边
c =2 x 放到 y 的右边
c =3 交换 x, y
c =4 颠倒链
最后求出奇数位置的数的总和
题解:直接维护无论如何每次每次都需要维护一段区间的位置,因此不去看位置、只需要知道每个盒子左边是哪个盒子右边是哪个盒子
这样就直接使用双向链表维护,接着颠倒时注意只是标记就好
最后注意几个细节:
首先颠倒后1与2的交换需要互换;
维护链表时可以提取出一个函数,每次都只需要多次使用这个函数;
c等于1,2,3时x与y的位置相邻时会出现很大的问题
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=<<;
const ll INF=1LL<<;
const double Pi=acos(-1.0);
const int Mod=1e9+;
const int Max=;
struct node
{
int left,right;
} ball[Max];//**表示i这个数字左右两边的数字**
void initPosition(int n)//双向链表初始化
{
for(int i=; i<=n; ++i)
{
ball[i].left=i-;
ball[i].right=(i+)%(n+);
}
}
void link(int l,int r)//左右相互连接
{
ball[l].right=r;
ball[r].left=l;
}
inline void Solve(int type,int &mark)
{
if(type==)
{
mark=(mark^);
return;
}
if(type!=&&!mark)
type=-type;//注意反转后只需交换type的1与2就好
int x,y;
scanf("%d %d",&x,&y);
int Lx=ball[x].left;
int Rx=ball[x].right;
int Ly=ball[y].left;
int Ry=ball[y].right;
if(type==&&Rx==y||type==&&Lx==y)
return;
if(type==)//通过下标找到x、y,将x放在y的左边
{
link(Lx,Rx);//**找到6个交换的规律**
link(Ly,x);
link(x,y);
}
else if(type==)
{
link(Lx,Rx);
link(x,Ry);
link(y,x);
}
else if(type==)
{
if(Rx==y)//注意
{
link(Lx,y);
link(y,x);
link(x,Ry);
}
else if(Lx==y){
link(y,Rx);
link(Ly,x);
link(x,y);
}
else
{
link(y,Rx);
link(Ly,x);
link(Lx,y);
link(x,Ry);
}
}
}
ll Print(int n,int mark)
{
ll res=0LL;
int start=;
for(int i=; i<=n; ++i)
{
if(ball[i].left==)
{
start=i;
break;
}
}
int now=start;
int coun=;
while(now)
{
res+=now;
now=ball[now].right;
if(now)
now=ball[now].right;
}
if(!(n&)&&!mark)
res=(ll)n*(n+)/-res;
return res;
}
int main()
{
int n,m;
int coun=;
while(~scanf("%d %d",&n,&m))
{
initPosition(n);
int mark=;//标记是否反转
while(m--)
{
int type;
scanf("%d",&type);
Solve(type,mark);
}
printf("Case %d: %lld\n",++coun,Print(n,mark));
}
return ;
}
UVA 12657 Boxes in a Line(双向链表+小技巧)的更多相关文章
- UVA 12657 Boxes in a Line 双向链表
题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47066 利用链表换位置时间复杂度为1的优越性,同时也考虑到使用实际 ...
- 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 ...
- UVA 12657 Boxes in a Line
双向链表 注意:如果算法是最后处理翻转情况时,注意指令4翻转后1,2两个指令也要翻转处理: 指令3 中交换盒子要注意两个盒子相邻的情况 #include <iostream> #inclu ...
- UVa 12657 Boxes in a Line(数组模拟双链表)
题目链接 /* 问题 将一排盒子经过一系列的操作后,计算并输出奇数位置上的盒子标号之和 解题思路 由于数据范围很大,直接数组模拟会超时,所以采用数组模拟的链表,left[i]和right[i]分别表示 ...
- 2019 SCUT SE 新生训练第四波 L - Boxes in a Line——双向链表
先上一波题目 https://vjudge.net/contest/338760#problem/L 这道题我们维护一个双向链表 操作1 2 3 都是双向链表的基本操作 4操作考虑到手动将链表反转时间 ...
- 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 UVA - 12657
You have n boxes in a line on the table numbered 1...n from left to right. Your task is to simulat ...
- 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(移动盒子)
You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to sim ...
随机推荐
- TCP粘包/拆包 ByteBuf和channel 如果没有Netty? 传统的多线程服务器,这个也是Apache处理请求的模式
通俗地讲,Netty 能做什么? - 知乎 https://www.zhihu.com/question/24322387 谢邀.netty是一套在java NIO的基础上封装的便于用户开发网络应用程 ...
- php中var_dump、var_export和print_r的用法区别
void var_dump ( mixed $expression [, mixed $... ] )此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值.数组将递归展开值,通过缩进显示其结 ...
- HDFS 手写mapreduce单词计数框架
一.数据处理类 package com.css.hdfs; import java.io.BufferedReader; import java.io.IOException; import java ...
- Apache的访问控制
目录配置段 注释不能写在指令后面,下面这样是不行的,应当换行,但为了阅读方便我就这么写了 Alias /dir/ "/var/www/html/admin" #路径 ...
- MySQL - 查询今天的数据(以及昨天、本月、上个月、今年...) 查询Datetime 时间的数据
1,查询当天(今天)的数据 1 SELECT * FROM `order` WHERE TO_DAYS(order_time) = TO_DAYS(NOW()) 2,查询昨天的数据 1 SELECT ...
- Linux IPC之管道通信
2017-04-07 管道通信在linux中使用较为频繁的进程通信机制.基于unix一切皆文件的传统,管道也是一种文件.所以可以使用一般的VFS接口对管道进行读写操作,如read.write.具体管道 ...
- Python3 格式化输出 %s & %d 等
1.打印字符串 print("My name is %s" %("Alfred.Xue")) #输出效果:My name is Alfred.Xue 2.打印整 ...
- Spring-ApplicationContext容器
Spring ApplicationContext容器 ApplicationContext是spring中比较高级的容器.和BeanFactory类似,它可以加载配置文件中定义的bean,并将所有b ...
- python服务器环境搭建——安装相关软件
在上一篇我们在本地的虚拟服务器上安装好CentOS7后,我们的python web服务.自定义的python service或python脚本需要在服务器上运行,还需要在服务器安装各种相关的软件才行, ...
- JAVA_HOME is not defined correctly
这是个神奇的问题.系统运行着运行着,突然就挂了.各种Java包丢失. 1.检查maven配置 .bash_profile 2.检查运行调取文件 .mavenrc 运行 java -version ...