Boxes in a Line UVA - 12657 (双向链表)
题目链接:https://vjudge.net/problem/UVA-12657
题目大意:输入n,m 代表有n个盒子 每个盒子最开始按1~n排成一行 m个操作,
1 x y :把盒子x放到y的左边
2 x y: 把盒子x放到y 的右边
3 x y:调换x y盒子的位置
4 表示反转整条链
思路:也是很明显的暴力 模拟 。 但是值得提的是 虽然是暴力,但是却是用的双向链表来暴力。
有很多要注意的地方 :
当操作4的时候,我们可以把本次操作记录一下,不必直接把全部的位置反转 试想一下,如果每次出现一个4 每次都反转 那多麻烦 (我们要反转的话,首先得找到最后一个盒子,然后从最后一个盒子往前重新存储一遍)
但是如果有记录操作4注意再碰到其他操作 也要随之改变 :
当有记录4的时候 操作1就相当于操作2 操作2相当于操作1
还有注意的是 操作3 两个盒子交换位置 : 两个盒子相邻和不相邻是不一样的 切记!!!
最后 要输出结果的话 : 注意有没有操作4 如果有操作4的话 如果是奇数 反转一次对结果没有影响 但是偶数 的话 反转一次 我们现在求的刚好的偶数位的 总的减掉就是答案了
具体看代码:
#include<iostream> #include<string.h> #include<vector> #include<stdio.h> using namespace std; const int maxn=1e5+5; int n; int Left[maxn]; int Right[maxn]; void link(int l,int r) //两个节点相连 {Right[l]=r;Left[r]=l; } int main() {int m,ca=0;while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=n;i++)//存好节点 {Left[i]=i-1;Right[i]=(i+1)%(n+1);//这里为何%(n+1) 试想一下 最后一个元素的右端是谁 显然是第一个元素0 }Left[0]=n;Right[0]=1;int op,x,y,inv=0;while(m--){scanf("%d",&op);if(op==4) inv=!inv;//相当于一种延迟标记 else{scanf("%d%d",&x,&y);if(op==3&&Right[y]==x) swap(x,y);// if(op!=3&&inv) op=3-op;//当调整一次顺序的时候 操作1和2 刚好相反 可以自己举例子if(op==1&&x==Left[y]) continue;//已经满足条件了if(op==2&&x==Right[y]) continue;int lx=Left[x],rx=Right[x],ly=Left[y],ry=Right[y];if(op==1) //调整位置 {link(lx,rx);link(ly,x);link(x,y);}else if(op==2){link(lx,rx);link(x,ry);link(y,x);}else if(op==3)//注意两者相连和不相连交换位置操作是不一样的 !!! {if(Right[x]==y) // {link(lx,y);link(y,x);link(x,ry);}else{link(lx,y);link(y,rx);link(ly,x);link(x,ry);}}}}int b=0;long long ans=0;for(int i=1;i<=n;i++){b=Right[b];//其实b就是i位置对应的值 可以仔细想一下if(i%2==1) ans+=b;}if(inv&&n%2==0) ans=(long long)n*(n+1)/2-ans;//自己举个例子就可以明白 n为奇数没有影响printf("Case %d: %lld\n",++ca,ans);}return 0; }
转载于:https://www.cnblogs.com/caijiaming/p/10345830.html
Boxes in a Line UVA - 12657 (双向链表)相关推荐
- 例题6-5 移动盒子(Boxes in a Line, UVa 12657)
例题6-5 移动盒子(Boxes in a Line, UVa 12657) 双向链表(数组模拟) #include<iostream> #include<algorithm> ...
- 33行代码AC——例题6-5 移动盒子(Boxes in a Line, UVa 12657)——解题报告
题目大意 对升序排列的n个数字(1开始编号)进行一系列操作,输出最终序列的奇位数之和.操作如下: 1 X Y:把X移到Y左侧 2 X Y:把X移到Y右侧 3 X Y:交换X和Y 4:反转序列(逆置) ...
- UVa 12657 双向链表
UVa 12657 双向链表 转载于:https://www.cnblogs.com/daijkstra/p/4475452.html
- 【UVA 12657】移动盒子 Boxes in a Line
[UVA 12657]移动盒子 Boxes in a Line 洛谷题目地址 [题意] 一行有n 个盒子,从左到右编号为1-n.模拟以下4种命令. 1 X Y :将盒子X 移动到Y 的左侧(如果X 已 ...
- UVA12657 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 ...
- CDQ分治入门 + 例题 Arnooks's Defensive Line [Uva live 5871]
CDQ分治入门 简介 CDQ分治是一种特别的分治方法,它由CDQ(陈丹琦)神犇于09国家集训队作业中首次提出,因此得名.CDQ分治属于分治的一种.它一般只能处理非强制在线的问题,除此之外这个算法作为某 ...
- UVa 12657 - Boxes in a Line ( 双向链表 )
题意 你有一行盒子,从左到右依次编号为1, 2, 3,-, n.可以执行以下4种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令). 2 X Y表示把盒子X移动到盒子Y ...
- Uva 12657 Boxes in a Line 双向链表
操作4比较特殊,为了避免一次性修改所有元素的指针,由于题目只要求输出奇数盒子的编号,所以我们可以灵活的根据是否进行过操作4对操作1 操作2 进行改动 操作3不受操作4影响 上代码.... #inclu ...
- UVA 12657 Boxes in a Line
题目链接:https://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_proble ...
最新文章
- python 自动填充表单,如何在Django / Python中自动填充PDF表单?
- python maketrans方法
- FMDB使用的数据库的三种形式
- 基于邮件系统的远程实时监控系统的实现 Python版
- 在阿里云上试用 Knative
- linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
- Unplugged In Newyork
- Spinnaker:云原生多云环境持续部署的未来
- 使用Google的项目(源码)托管服务(转)
- 027_《Delphi Direct X 图形与游戏程序设计》
- 2021年中国图书出版行业经营现状及重点企业对比分析:凤凰传媒优势明显[图]
- 基于JavaWeb的背单词系统的设计与实现
- 1393: 国防部长PIPI
- Excel 2011 显示被隐藏的第一行
- 换个角度看前几天的女孩父亲杀男孩事件 另附一些对当前教育的感想
- Qt读取Json文件数据
- 拼多多商家刚开店是如何破零的?
- 磁盘分区怎么恢复回去
- sublime text 3 调色板插件
热门文章
- Visual Studio控制台程序输出窗口一闪而过的解决方法
- VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
- scrollview嵌套listview 滑动事件冲突的解决方法
- arcgis desktop 10.1 license manager无法启动问题解决
- 解决 Oracle TNSListener 服务启动找不到路径问题
- Handshake failed due to invalid Upgrade header: null 解决方案
- 【报告分享】2022年元宇宙全球年度(202页干货):蓄积的力量-北京大学.pdf(附下载链接)...
- 推荐系统系列教程之十一:那些在Netflix Prize中大放异彩的推荐算法
- Leetcode每日一题:861.score-after-flipping-matrix(反转矩阵后的得分)
- 《Deep Learning》笔记