Uva 12657 双向链表
Posted 树的种子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 12657 双向链表相关的知识,希望对你有一定的参考价值。
题目链接:https://uva.onlinejudge.org/external/126/12657.pdf
题意:
给你一个从1~n的数,然后给你操作方案
• 1 X Y : move box X to the left to Y (ignore this if X is already the left of Y )
• 2 X Y : move box X to the right to Y (ignore this if X is already the right of Y )
• 3 X Y : swap box X and Y
• 4: reverse the whole line.
WA的地方:
1、指针的赋值顺序,还是先保存一下。
2、交换的时候,如果相邻,要特判,否则指针会乱。
3、反转的时候,我这里是实际上没有反转的,因此,操作 1,2,就会由于是否反转而混乱。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 100005; 6 int lefts[maxn]; 7 int rights[maxn]; 8 9 void link(int x,int y) 10 { 11 rights[x] = y; 12 lefts[y] = x; 13 } 14 15 int main() 16 { 17 int n,m; 18 int kase = 1; 19 while(~scanf("%d%d",&n,&m)) 20 { 21 for(int i=1; i<=n; i++) 22 { 23 lefts[i] = i-1; 24 rights[i] = (i+1)%(n+1); 25 } 26 lefts[0] = n; 27 rights[0] = 1; 28 int re = 0; 29 while(m--) 30 { 31 int op; 32 scanf("%d",&op); 33 if(op==4) 34 { 35 re = !re; 36 continue; 37 } 38 int x,y; 39 scanf("%d%d",&x,&y); 40 41 if(op==3&&rights[y]==x) swap(x,y); 42 if(op!=3&&re) op = 3 - op; 43 if(op==1&&lefts[y]==x) continue; 44 if(op==2&&rights[y]==x) continue; 45 46 int lx = lefts[x],rx = rights[x],ly =lefts[y],ry = rights[y]; 47 if(op==1) 48 { 49 link(lx,rx); 50 link(ly,x); 51 link(x,y); 52 } 53 else if(op==2) 54 { 55 link(lx,rx); 56 link(x,ry); 57 link(y,x); 58 } 59 else if(op==3) { 60 61 if(rights[x]==y) { 62 link(lx,y); 63 link(y,x); 64 link(x,ry); 65 } 66 else { 67 link(lx,y); 68 link(y,rx); 69 link(ly,x); 70 link(x,ry); 71 } 72 } 73 } 74 int b = 0; 75 long long ans = 0; 76 for(int i=1; i<=n; i++) 77 { 78 b = rights[b]; 79 if(i%2==1) 80 ans +=(long long)b; 81 } 82 if(re) 83 { 84 ans = (long long)n*(long long)(n+1)/2 - ans; 85 } 86 printf("Case %d: %lld\n",kase++,ans); 87 } 88 return 0; 89 }
以上是关于Uva 12657 双向链表的主要内容,如果未能解决你的问题,请参考以下文章
Boxes in a Line UVA - 12657 (双向链表)
Uva 12657 Boxes in a Line 双向链表