你有一行盒子,從左到右依次編號為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 2const
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...