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

2022-08-17 02:00:22 字數 1080 閱讀 3262

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

從操作1,2來看, 需要有乙個資料結構, 記錄每個盒子左邊和右邊是什麼。

操作4如果真的模擬複雜度較高也比較麻煩, 可以考慮建乙個標記, 表示有沒執行過操作4

但是注意了 如果執行了操作4後, 如果操作1 2操作不變的話, 那麼操作1就是2,2 就是1(放在左邊 + 反轉 = 放在右邊)

雙向鍊錶有乙個比較實用的函式

意思就是將l,r兩個元素相連, l在r的左邊, r在l的右邊。

1 #include 2

const

int maxn = 100000 + 7;3

intn, left[maxn], right[maxn];

4void link(int l, int r)

8int

main()

916 right[0] = 1;//

注意0右邊是1 左邊是 n

17 left[0] =n;

18int op, x, y, inv = 0;19

while(m--)

34else

if(op == 2)37

else

if(op == 3)42

else48}

49}50}

51int b = 0;52

long

long ans = 0;53

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

57if(inv && n % 2 == 0) ans = (long

long) n * (n+1)/2 -ans;

58 printf("

case %d: %lld\n

", ++kase, ans);59}

60 }

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

uva12657 移動盒子

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

6 5 移動的盒子 uva12657

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