UVa 12657 - Boxes in a Line ( 双向链表 )
题意
你有一行盒子,从左到右依次编号为1, 2, 3,…, n。可以执行以下4种指令:
1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令)。
2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令)。
3 X Y表示交换盒子X和Y的位置。
4 表示反转整条链。
思路
双向链表
每次操作只需修改链表中的元素指向
另外, 如果程序一直在反转整条链, 如果一直操作的话必然复杂度很高
因为题目只求所有奇数位置标号之和, 当boxnum为奇数, 盒子逆序无影响
boxnum为偶数时才有影响, 再具体判断即可 . 所以将反转链操作用bool标记即可
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;
typedef long long ULL;
const int maxn = 100000 + 10;
int l[maxn],r[maxn];void link( int left, int right ){r[left] = right;l[right] = left;
}int main()
{int boxnum, casenum, i;int x, a, b, num = 0;ULL result;bool ok;while( ~scanf("%d%d",&boxnum, &casenum) ){for( i = 1; i <= boxnum; i++ ){l[i] = i - 1;r[i] = ( i + 1 ) % ( boxnum + 1 );}l[0] = boxnum;r[0] = 1;ok = false;while( casenum-- ){scanf("%d",&x);if( x == 4 ){ //反转ok = !ok;continue;}scanf("%d%d",&a,&b);if( x == 3 && r[b] == a ) swap(a,b);if( x != 3 && ok ) x = 3 - x;if( (x == 1 && l[b] == a) || (x == 2 && r[b] == a) ) continue;int la = l[a], ra = r[a], lb = l[b], rb = r[b];if( x == 1 ){link(la, ra);link(a, b);link(lb, a);}else if( x == 2 ){link(la, ra);link(b, a);link(a, rb);}else if( x == 3 ){if( ra == b ){link(la, b);link(b, a);link(a, rb);}else{link(la, b);link(b, ra);link(lb, a);link(a, rb);}}}int t = 0;result = 0;for( int i = 1; i <= boxnum; i++ ){t = r[t];if( i % 2 != 0 ) result += t;}if( ok && boxnum % 2 == 0 )result = (ULL)boxnum*(boxnum+1)/2 - result;//cout << boxnum*(boxnum+1)/2 ;printf("Case %d: %llu\n",++num, result);}return 0;
}
转载于:https://www.cnblogs.com/JinxiSui/p/9740611.html
UVa 12657 - Boxes in a Line ( 双向链表 )相关推荐
- 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 ...
- 例题6-5 移动盒子(Boxes in a Line, UVa 12657)
例题6-5 移动盒子(Boxes in a Line, UVa 12657) 双向链表(数组模拟) #include<iostream> #include<algorithm> ...
- 【UVA 12657】移动盒子 Boxes in a Line
[UVA 12657]移动盒子 Boxes in a Line 洛谷题目地址 [题意] 一行有n 个盒子,从左到右编号为1-n.模拟以下4种命令. 1 X Y :将盒子X 移动到Y 的左侧(如果X 已 ...
- UVa 12657 双向链表
UVa 12657 双向链表 转载于:https://www.cnblogs.com/daijkstra/p/4475452.html
- 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 ...
- Boxes in a Line UVA - 12657 (双向链表)
题目链接:https://vjudge.net/problem/UVA-12657 题目大意:输入n,m 代表有n个盒子 每个盒子最开始按1~n排成一行 m个操作, 1 x y :把盒子x放到y ...
- 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 11174 - Stand in a Line
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
最新文章
- Android TextView 在strings 里面 实现换行
- 静态页面中导航切换时的当前状态(四中方法)
- AOP的两种实现方式
- 用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识
- 寡头时代——新的希望还是?
- POST型SQL注入教学
- 可变模糊集理论matlab程序,可变模糊集理论的哲学基础
- 使用python处理视频文件,提取关键帧并保存【已调通】
- 北京链家买二手房的经历与感受
- CSS(PS切图、学成在线案例)
- 拉曼光谱避免荧光效应的方法
- 数组按照元素个数由多到少排序
- JavaScript对象 1
- 微信群发软件哪个好?好用的群发软件选择
- 【OpenPCDet】Kitti数据集下训练PointPillars并评估可视化
- Dockerfile unable to access ‘.git/‘: Failed to connect to gitlab.com
- vue npm install --save-dev css-loader出现的错误
- 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(二)
- Linux 内核启动过程--head.S(arch/xxx/kernel下的)
- npm run build 打包爬坑记(2)生产、测试打包
热门文章
- mailbox 编程_往死里写——从站mailbox实现 | 学步园
- vpc源站保护_污染源自动监控设施运营要求
- for循环下标 shell_如果再写for循环,我就锤自己
- C++ STL vector的操作
- c++ mysql 操作_c++操作mysql入门详解
- angular js创建表单_如何优雅的使用 Angular 表单验证
- 动词ing基本用法_如果实在分不清英语动名词和现在分词,那就直接学习-ing分词...
- 访谈编码怎么做_怎么才能让口才得到提升
- 怎么控制ajax执行先后顺序,[转]多个ajax请求时控制执行顺序或全部执行后的操作...
- 杭电1108java_按照这个步骤来刷题,迷茫的你两个月亦能成为王者