UVA12657 Boxes in a Line【双向链表】【数组模拟】

2024-06-15 05:48

本文主要是介绍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 simulate 4


kinds of commands:


• 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y )
• 2 X Y : move box X to the right to Y (ignore this if X is already the right of Y )
• 3 X Y : swap box X and Y

• 4: reverse the whole line.


Commands are guaranteed to be valid, i.e. X will be not equal to Y .


For example, if n = 6, after executing 1 1 4, the line becomes 2 3 1 4 5 6. Then after executing
2 3 5, the line becomes 2 1 4 5 3 6. Then after executing 3 1 6, the line becomes 2 6 4 5 3 1.

Then after executing 4, then line becomes 1 3 5 4 6 2


Input


There will be at most 10 test cases. Each test case begins with a line containing 2 integers n, m

(1 ≤ n, m ≤ 100, 000). Each of the following m lines contain a command.


Output


For each test case, print the sum of numbers at odd-indexed positions. Positions are numbered 1 to n

from left to right.


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: 9

Case 3: 2500050000


题目大意:你有一行盒子,从左到右编号为1~n,现在有4种操作。

1 X Y 表示把X盒子移到Y盒子的左边

2 X Y 表示把X盒子移到Y盒子的右边

3 X Y 表示交换X盒子和Y盒子的位置

4 将盒子顺序全部翻转过来

最后问进行m次操作后,奇数位置的盒子编号和为多少

思路:最好的方法使用双向链表。这里用数组的方法模拟,用Left[i]和Right[i]

分别表示编号为i的盒子左边和右边的盒子编号(为0表示没有盒子)。通过模拟

链表连接的方法改变连接顺序。


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;int Left[100010],Right[100010];void link(int L,int R)
{Right[L] = R;Left[R] = L;
}int main()
{int n,m,kase = 0;while(cin >> n >> m){for(int i = 1; i <= n; i++){Left[i] = i-1;Right[i] = (i+1) % (n+1);}Right[0] = 1;Left[0] = n;int inv = 0,X,Y;while(m--){int op;cin >> op;if(op == 4)inv = !inv;else{cin >> X >> Y;if(op == 3 && Right[Y] == X)swap(X,Y);if(op != 3 && inv)op = 3 - op;if(op == 1 && X == Left[Y])continue;if(op == 2 && X == Right[Y])continue;int LX,RX,LY,RY;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(Y,X);link(X,RY);}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 num = 0;long long ans = 0;for(int i = 1; i <= n; i++){num = Right[num];if(i&1)ans += num;}if(inv && !(n&1))ans = (long long)n*(n+1)/2 - ans;cout << "Case " << ++kase <<": " << ans << endl;}return 0;
}



这篇关于UVA12657 Boxes in a Line【双向链表】【数组模拟】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062588

相关文章

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2