日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVa 12657 - Boxes in a Line ( 双向链表 )

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVa 12657 - Boxes in a Line ( 双向链表 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

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

思路

雙向鏈表
每次操作只需修改鏈表中的元素指向
另外, 如果程序一直在反轉整條鏈, 如果一直操作的話必然復雜度很高
因為題目只求所有奇數位置標號之和, 當boxnum為奇數, 盒子逆序無影響
boxnum為偶數時才有影響, 再具體判斷即可 . 所以將反轉鏈操作用bool標記即可

AC代碼

#include <iostream> #include <cstdio> #include <cstring>using namespace std; typedef long long ULL; const int maxn = 100000 + 10; int l[maxn],r[maxn];void link( int left, int right ){r[left] = right;l[right] = left; }int main() {int boxnum, casenum, i;int x, a, b, num = 0;ULL result;bool ok;while( ~scanf("%d%d",&boxnum, &casenum) ){for( i = 1; i <= boxnum; i++ ){l[i] = i - 1;r[i] = ( i + 1 ) % ( boxnum + 1 );}l[0] = boxnum;r[0] = 1;ok = false;while( casenum-- ){scanf("%d",&x);if( x == 4 ){ //反轉ok = !ok;continue;}scanf("%d%d",&a,&b);if( x == 3 && r[b] == a ) swap(a,b);if( x != 3 && ok ) x = 3 - x;if( (x == 1 && l[b] == a) || (x == 2 && r[b] == a) ) continue;int la = l[a], ra = r[a], lb = l[b], rb = r[b];if( x == 1 ){link(la, ra);link(a, b);link(lb, a);}else if( x == 2 ){link(la, ra);link(b, a);link(a, rb);}else if( x == 3 ){if( ra == b ){link(la, b);link(b, a);link(a, rb);}else{link(la, b);link(b, ra);link(lb, a);link(a, rb);}}}int t = 0;result = 0;for( int i = 1; i <= boxnum; i++ ){t = r[t];if( i % 2 != 0 ) result += t;}if( ok && boxnum % 2 == 0 )result = (ULL)boxnum*(boxnum+1)/2 - result;//cout << boxnum*(boxnum+1)/2 ;printf("Case %d: %llu\n",++num, result);}return 0; }

轉載于:https://www.cnblogs.com/JinxiSui/p/9740611.html

總結

以上是生活随笔為你收集整理的UVa 12657 - Boxes in a Line ( 双向链表 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。