CSU 1329 一行盒子(模擬鍊錶)

2021-07-30 04:15:49 字數 1693 閱讀 2095

description

你有一行盒子,從左到右依次編號為1, 2, 3,…, n。你可以執行四種指令:

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

input

輸入包含不超過10組資料,每組資料第一行為盒子個數n和指令條數m(1<=n,m<=100,000),以下m行每行包含一條指令。

output

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

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

source

湖南省第九屆大學生計算機程式設計競賽

當進行反轉操作時,實際上並不需要反轉,只需要記錄反轉的次數就行了。當反轉次數為奇數時,op=1的操作變成op=2的操作,op=2的操作變成op=1的操作,其他的不變。

還有就是要讓它成環,這樣方便找到起點和終點

具體細節詳見**

**:

#include

#define maxn 100000+10

typedef long long ll;

int pre[maxn],next[maxn];

int n,m;

int main()

next[n]=0;//使之成環,對最後尋找開頭和結尾有用

int op,x,y;

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

if((tot&1)&&op<3)

op=3-op;

if(op==1)

else

if(op==2)

else

if(op==3)//注意op==3時,要對x和y相鄰的情況特判

else

if(next[y]==x)

else}}

int*st,*ed;

if(tot&1)//反轉奇數次,最終優化為反轉一次

else//反轉偶數次就是不反轉

ll ans=0;

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

}printf("case %d: %lld\n",++t,ans);

}return

0;}

總結:這種題還是需要多做一些,別怕麻煩,不然比賽的時候還是做不出來

csu 1329 一行盒子

一行盒子 crawling failed submit status practice csu 1329 description 你有一行盒子,從左到右依次編號為1,2,3,n 你可以執行四種指令 1 x y表示把盒子 x移動到盒子 y左邊 如果 x已經在 y的左邊則忽略此指令 2 x y表示把盒子...

csu 1329 一行盒子(雙向鍊錶模擬)

靜態模擬雙向鍊錶,只要寫的仔細一點就沒有難度,自己就是因為不仔細寫了很長時間。注意 1.修改兩個元素時不但要考慮這兩個元素本身,還要考慮他們的前驅和後繼結點的變化。2.交換操作注意兩個相鄰元素交換是特殊情況。3.反轉整個表不需要每次都轉,記錄下轉了多少次 偶數次等於沒轉 當前如果被反轉了那麼1操作就...

1662 一行盒子

time limit 1 sec memory limit 128 mb submit 10 solved 6 submit status web board 你有一行盒子,從左到右依次編號為1,2,3,n。你可以執行四種指令 l 1 x y表示把盒子x移動到盒子y左邊 如果x已經在y的左邊則忽略此...