题意

你有一行盒子,从左到右依次编号为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 ( 双向链表 )相关推荐

  1. Uva 12657 Boxes in a Line 双向链表

    操作4比较特殊,为了避免一次性修改所有元素的指针,由于题目只要求输出奇数盒子的编号,所以我们可以灵活的根据是否进行过操作4对操作1 操作2 进行改动 操作3不受操作4影响 上代码.... #inclu ...

  2. UVA 12657 Boxes in a Line

    题目链接:https://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_proble ...

  3. 例题6-5 移动盒子(Boxes in a Line, UVa 12657)

    例题6-5 移动盒子(Boxes in a Line, UVa 12657) 双向链表(数组模拟) #include<iostream> #include<algorithm> ...

  4. 【UVA 12657】移动盒子 Boxes in a Line

    [UVA 12657]移动盒子 Boxes in a Line 洛谷题目地址 [题意] 一行有n 个盒子,从左到右编号为1-n.模拟以下4种命令. 1 X Y :将盒子X 移动到Y 的左侧(如果X 已 ...

  5. UVa 12657 双向链表

    UVa 12657 双向链表 转载于:https://www.cnblogs.com/daijkstra/p/4475452.html

  6. 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 ...

  7. Boxes in a Line UVA - 12657 (双向链表)

    题目链接:https://vjudge.net/problem/UVA-12657 题目大意:输入n,m  代表有n个盒子 每个盒子最开始按1~n排成一行  m个操作, 1 x y  :把盒子x放到y ...

  8. 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:反转序列(逆置) ...

  9. UVa 11174 - Stand in a Line

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

最新文章

  1. Android TextView 在strings 里面 实现换行
  2. 静态页面中导航切换时的当前状态(四中方法)
  3. AOP的两种实现方式
  4. 用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识
  5. 寡头时代——新的希望还是?
  6. POST型SQL注入教学
  7. 可变模糊集理论matlab程序,可变模糊集理论的哲学基础
  8. 使用python处理视频文件,提取关键帧并保存【已调通】
  9. 北京链家买二手房的经历与感受
  10. CSS(PS切图、学成在线案例)
  11. 拉曼光谱避免荧光效应的方法
  12. 数组按照元素个数由多到少排序
  13. JavaScript对象 1
  14. 微信群发软件哪个好?好用的群发软件选择
  15. 【OpenPCDet】Kitti数据集下训练PointPillars并评估可视化
  16. Dockerfile unable to access ‘.git/‘: Failed to connect to gitlab.com
  17. vue npm install --save-dev css-loader出现的错误
  18. 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(二)
  19. Linux 内核启动过程--head.S(arch/xxx/kernel下的)
  20. npm run build 打包爬坑记(2)生产、测试打包

热门文章

  1. mailbox 编程_往死里写——从站mailbox实现 | 学步园
  2. vpc源站保护_污染源自动监控设施运营要求
  3. for循环下标 shell_如果再写for循环,我就锤自己
  4. C++ STL vector的操作
  5. c++ mysql 操作_c++操作mysql入门详解
  6. angular js创建表单_如何优雅的使用 Angular 表单验证
  7. 动词ing基本用法_如果实在分不清英语动名词和现在分词,那就直接学习-ing分词...
  8. 访谈编码怎么做_怎么才能让口才得到提升
  9. 怎么控制ajax执行先后顺序,[转]多个ajax请求时控制执行顺序或全部执行后的操作...
  10. 杭电1108java_按照这个步骤来刷题,迷茫的你两个月亦能成为王者