題目大意:
給你n個盒子,分別標號為1~n;有下面4種操作:
「1 x y」 表示將x移到y的左邊;
「2 x y」 表示將y移到y的右邊;
「3 x y」 表示交換x與y的位置;
「4」 表示將1~n所有的盒子反序。
要你求經過m次操作之後,所有奇數字置的盒子標號之和。
解題思路
大體的說一下 **裡有詳細注釋
當n是奇數時,操作4逆序不會影響奇數字置盒子標號之和
當n是偶數時,操作4逆序就會影響 最終結果是所有位置標號之和-奇數字置標號之和
一開始對那個swap(x,y)一直不理解
然後慢慢捋一捋 3 x,y 是交換 x,y的位置 如果當時位置是 y,x的話 就把x,y的序號互換,這樣就是把 操作轉化為交換 y,x的位置 如果本來就是 x,y的話 就是交換xy的位置
**如下
#includeusing namespace std;
const int maxn=1e5+10;
int l[maxn],r[maxn];
void link(int a,int b)//讓a,b挨著
int main()
r[0]=1;
l[0]=n;
while(m--)
else if(k==2)//x移到y右邊
else
else//不相鄰的話 }}
} long long ans=0,num=0;
int kk=0;
for(i=1;i<=n;i++)
if(n%2==0&&flag==1)
ans=num-ans;
cas++;
cout<<"case "
}
Uva 12657 (雙向鍊錶
最後要求輸出奇數字數的和,記錄操作4的次數和n的奇偶即可表示出答案 用雙向鍊錶來表示關係 include include includetypedef long long ll int righta 100005 lefta 100005 void link int l,int r l r usin...
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...
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 表示反轉整條鏈。從操作1,2來看,需要有乙...