uva12657 移動盒子

2021-07-14 16:44:29 字數 1471 閱讀 3651

你有一行盒子,從左到右依次編號為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:表示反轉整條鏈。

指令保證合法,即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。

【輸入格式】

輸入包含不超過10組資料,每組資料第一行為盒子數n和指令m,以下m行每行包含一條指令。

【輸出格式】

每組資料輸出一行,即所有奇數字置的盒子編號之和。位置從左到右編號為1~n。

【輸入樣例】

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 【輸出樣例】

12 9

2500050000

【資料範圍】

n,m<=100000

雙向鍊錶記錄每乙個數的前驅和後繼

唯一麻煩的是操作4

用乙個變數標記是否翻轉

不難想到翻轉後把a移到b前等價於把a移到b之後再翻轉

最後計算奇項和的時候:

1.有奇數個數,則翻轉對計算無影響

2.若有偶數個數,則翻轉後的奇項和等於數列總和減去翻轉前的奇項和

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn 100005

using namespace std;

int n,m,ch,x,y;

intnext[maxn],last[maxn];

void link(int a,int b)

int main()

next[n]=0;

for(int i=1;i<=m;i++)

if(ch==2) //x移到y的右邊

if(ch==3)

else}}

}int k=0;

for(int i=1;i<=n;i++)

if(n%2==0&&ok==1) ans=all-ans;

cout0;}

6 5 移動的盒子 uva12657

較為複雜的一題 有點類似6 1 但是分析完之後比6 1簡單 就是按照思路模擬就好!學會了雙向鍊錶 先初始化 link是關鍵 分析命令 可以大大簡化 反轉鍊錶不用反轉 改操作和輸出就行 includeusing namespace std void link int int int left1 100...

UVA 12657 移動盒子 最詳細講解

題目鏈結 有一行從左到右編號為 1,2 3,4 n 的盒子,定義以下四種指令 1 x y 將編號為x 的盒子移動到 y 的左邊 若x已在 y 的左邊,則忽略此指令 2 x y 將編號為 x 的盒子移動到 y 的右邊 若x 已在y的右邊,則忽略此指令 3 x y 交換 x 和 y 盒子的位置 4 將所...

Uva 12657 移動盒子(雙向鍊錶)

你有一行盒子,從左到右依次編號為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 表示反轉整條鏈。指令保證合法,即x不等於y...