1329: 一行盒子

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 740  Solved: 145
[Submit][Status][Web Board]

Description

你有一行盒子,从左到右依次编号为1, 2, 3,…, n。你可以执行四种指令:

1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令)。
2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令)。
3 X Y表示交换盒子X和Y的位置。
4 表示反转整条链。

指令保证合法,即X不等于Y。例如,当n=6时在初始状态下执行1 1 4后,盒子序列为2 3 1 4 5 6。接下来执行2 3 5,盒子序列变成2 1 4 5 3 6。再执行3 1 6,得到2 6 4 5 3 1。最终执行4,得到1 3 5 4 6 2。

Input

输入包含不超过10组数据,每组数据第一行为盒子个数n和指令条数m(1<=n,m<=100,000),以下m行每行包含一条指令。

Output

每组数据输出一行,即所有奇数位置的盒子编号之和。位置从左到右编号为1~n。

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

Sample Output

Case 1: 12
Case 2: 9Case 3: 2500050000难点在于第四种操作,第四种操作是反转,效果是前后继交换了,其实根本不需要操作,只需记录反转的 次数就行了。反转次数为奇数时,flag=1的操作变成flag=2的操作,flag=2的操作变成flag=1的操作,其他的不变。因为反转后,一个数的前面变成后面,后面变成前面。还有就是构成环,方便找到起点和终点。AC代码:
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #include<string>
 7 #include<cmath>
 8 using namespace std;
 9 int *tmp1,*tmp2;
10 const int N = 1e5+10;
11 int LEFT[N],RIGHT[N];
12 void swap(int a,int b)
13 {
14     RIGHT[a] = b;
15     LEFT[b] = a;
16 }
17 int main()
18 {
19  int cas = 1;
20  int T,cnt,nest,flag,m,n,x,y;
21  while(~scanf("%d %d",&m,&n))
22   {
23      for(int i=1;i<=m;i++)//预处理
24      {
25          LEFT[i] = i-1;
26          RIGHT[i] = i+1;
27      }
28      RIGHT[m] = 0;
29      cnt = 0;
30      while(n--)
31      {
32          scanf("%d",&flag);
33          if(flag != 4) scanf("%d %d",&x,&y);
34             else cnt++;
35             if((cnt&1) && flag<3) flag = 3 - flag;
36             if(flag == 1 && LEFT[y]!=x)
37             {
38                     swap(LEFT[x],RIGHT[x]);
39                     swap(LEFT[y],x);
40                     swap(x,y);
41             }
42             else if(flag == 2 && RIGHT[y]!=x)
43             {
44                      swap(LEFT[x],RIGHT[x]);
45                      swap(x,RIGHT[y]);
46                      swap(y,x);
47             }
48             else if(flag == 3)
49             {
50                 if(RIGHT[x] == y)//两者在挨着;
51                 {
52                   swap(LEFT[x],y);
53                   swap(x,RIGHT[y]);
54                   swap(y,x);
55                 }
56                 else if(LEFT[x] == y)
57                 {
58                     swap(LEFT[y],x);
59                     swap(y,RIGHT[x]);
60                     swap(x,y);
61                 }
62                 else
63                     {
64                       int t1 = LEFT[x],t2 = RIGHT[x],t3 = LEFT[y],t4 = RIGHT[y];
65                         swap(t1,y);
66                         swap(y,t2);
67                         swap(t3,x);
68                         swap(x,t4);
69
70                     }
71             }
72      }
73    long long ans = 0;
74    if(cnt&1) //翻转一下
75         {
76             tmp2 = RIGHT;
77             tmp1 = LEFT;
78         }
79         else {
80             tmp2 = LEFT;
81             tmp1 = RIGHT;
82         }
83         for(int i=1;i<=m;i++)
84         {
85             if(tmp2[i] == 0)//寻找第一位
86             {
87                 for(int k=1;i;i = tmp1[i],k++)
88                       if(k&1) ans = ans+i;
89                 printf("Case %d: %lld\n",cas++,ans);
90                 break;
91             }
92         }
93   }
94   return 0;
95 }

转载于:https://www.cnblogs.com/lovychen/p/4459630.html

CSU 1329: 一行盒子相关推荐

  1. toj 4596 一行盒子

    toj 4596 一行盒子 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 116 测试通过:11 描述 你有一行盒子,从左到右依次编号为1, 2, ...

  2. uva12657 移动盒子

    你有一行盒子,从左到右依次编号为1,2,3,-,n.可以执行以下4种指令: 1 x y:表示把盒子x移动到盒子y的左边(如果x已经在y的左边则忽略此指令). 2 x y:表示把盒子x移动到盒子y的右边 ...

  3. 移动盒子——双向链表

    移动盒子UVa 12657 你有一行盒子,从左到右依次编号为1,2,3,-,n.可以执行以下4种指令: 1 x y:表示把盒子x移动到盒子y的左边(如果x已经在y的左边则忽略此指令). 2 x y:表 ...

  4. Qt窗口部件与布局之二:布局管理

    第3章讲述了一些窗口部件,当时往界面上拖放部件时都是随意放置的,这对于学习部件的使用没有太大的影响,但是,对于一个完善的软件,布局管理却是必不可少的. 无论是想要界面中部件有一个很整齐的排列,还是想要 ...

  5. UVa 12657 - Boxes in a Line ( 双向链表 )

    题意 你有一行盒子,从左到右依次编号为1, 2, 3,-, n.可以执行以下4种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令). 2 X Y表示把盒子X移动到盒子Y ...

  6. 关于前端的HTML+CSS基础知识汇总(较为全面)

    这里写目录标题 初识 空元素的两种写法 元素之间的嵌套 标准的文档结构(告诉浏览器当前使用的 HTML 标准是 html5.) 语义化 什么是语义化? 为什么需要语义化? 文本元素 h p span( ...

  7. 刘海洋 · LaTeX 不快速的入门 学习笔记

    刘海洋 · LaTeX 不快速的入门 学习笔记 网址链接 : 刘海洋 · LaTeX 不快速的入门 - 跟着大神学习最纯正的 LaTeX 知识 一.组织文档结构 1. 文档基本结构 以document ...

  8. HTML CSS笔记(没有基础内容,比如br标签是换行什么的),CSS2.1,CSS3,响应式布局

    每一个知识点都有相应的测试代码,你可以将代码复制到文件中,然后在浏览器中打开测试即可 推荐使用谷歌浏览器Chrome,因为都没有做hack浏览器兼容 文章目录 一.基础(HTML和CSS中较复杂内容) ...

  9. QT creator使用(四):布局管理系统

    目录 4.0 本章介绍 4.1 布局管理系统 4.1.1 布局管理器 4.1.2 设置部件大小 4.1.3 可扩展窗口 4.1.4 分裂器(QSplitter) 4.2 设置伙伴(buddy) 4.3 ...

最新文章

  1. maven添加本地jar包依赖
  2. Java设计模式之享元flyweight模式代码示例
  3. 相机参数设置程序_自定义拍摄模式怎么设置?教你学会相机设置。
  4. 【CTSC2010】珠宝商【后缀自动机】【点分治】【根号分治】
  5. 微信公众号web端关闭本页面
  6. java swing 图片上加热点_外卖图片品牌全靠P,4元成本料理包加热后,平台上20元卖出...
  7. HTTP1.1与HTTP1.0
  8. python文本聚类分析作用_文本聚类应用意义
  9. 专访李运华:程序员如何在技术上提升自己
  10. 矩阵的 正定与半正定
  11. Office在线协作(三)- O2OA连接本地部署的OnlyOffice Docs Server服务器 For Windows Server
  12. 计算机知识怎么记牢,怎么快速学拼音打字-教孩子学拼音的3个好方法:手脑结合、增加锚点、有趣的知识才能记得牢...
  13. word打不开html,word打不开怎么办?word文档打不开怎么办?
  14. 最新!2016中国城市GDP排名出炉
  15. php程序root权限,root权限是什么
  16. node.js 基础
  17. EJB是个什么东东?
  18. 详解程序员驻场开发服务的具体流程
  19. 域名解析工具_12种帮助您购买完美域名的工具
  20. S7-1200程序博图V15伺服轴控制西门子V90PN S7 -1200程序博图V15伺服轴控制西门子V90PN

热门文章

  1. 第12章[12.4] 鼠标移入移除时弹出和关闭窗口
  2. invalid LOC header(bad signature)错误及解决
  3. 如何清除web 服务器的缓存
  4. linux卸载tar安装的erlang包,linux - 从tar安装erlang导致错误,想知道如何指定文件夹 - 堆栈内存溢出...
  5. centos 6.9 mysql5.7_centos6.9升级Mysql版本至5.7
  6. 蓝牙怎么区分单模和双模_小院闲聊#01#——蓝牙的发展和不同蓝牙之间的关系...
  7. windows一键安装oracle,Oracle在Windows下快速搭建
  8. python 矩阵乘法梯度下降_使用python和numpy进行梯度下降
  9. c语言广播程序,C语言socket编程---udp通信及广播
  10. java 装饰者_java装饰者模式怎么用?