C1028 - 移动盒子

题目描述

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

① 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令,指的是X紧挨着Y的情况,即XY)

② 2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令,指的是X紧挨着Y的情况,即YX)

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

④ 4 表示反转整条链

指令保证合法,即X不等于Y。

例如,当n = 6时在初始状态下(1 2 3 4 5 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。

输入格式

输入包含1组数据,第一行为盒子个数n和指令条数m,以下m行每行包含一条指令。

输出格式

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

输入输出样例

输入样例 输出样例
6 4
1 1 4
2 3 5
3 1 6
4
12
6 3
1 1 4
2 3 5
3 1 6
9
100000 1
4
2500050000

输入输出样例解释

以第一组样例说明为例:

第1行:6 4,代表有6个盒子(初始排列为:1 2 3 4 5 6),4代表接下来有4条指令

第2行:1 1 4,代表将1盒子移动到4盒子的左边,执行完该指令后,排列为:2 3 1 4 5 6

第3行:2 3 5,代表将3盒子移动到5盒子的右边,执行完该指令后,排列为:2 1 4 5 3 6

第4行:3 1 6,代表将1盒子和6盒子交换,执行完该指令后,排列为:2 6 4 5 3 1

第5行:4,代表将整个排列反转一下,执行完该指令后,排列为:1 3 5 4 6 2

最后输出的是,最终排列的奇数位置的盒子编号之和(位置从左到右编号为1~n):

1 + 5 + 6 => 12

最终输出结果为:12

注意数据比较大,需要用到long long去保存最终的结果

数据范围与提示

50%的数据:$1 \le n, m \le 100$

100%的数据:$1 \le n, m \le 10^{5}$

提示

本题难度较大,建议大家先用简单的方式(比如数组、vector这类的)先去拿到个部分分(50分)

如果时间、能力允许的条件下,可以冲个100分的做法

测试点数目

共10个测试点,每个测试点10分

时间与内存限制

每个测试点时间:1000ms(1.0s),内存:256MiB

输入输出模式

本OJ支持两种输入输出模式

1. 标准输入输出模式:
直接从标准输入和标准输出读写数据,不需要使用freopen进行文件输入输出重定向
2. 文件输入输出模式(国内信奥赛输入输出模式):
从文件中读写数据,需要使用freopen进行输入输出重定向
本题输入文件名为:C1028.in,输出文件名为:C1028.out