***UVA12657 Boxes in a Line ACM解题报告(链表)
2014-12-27 16:11
225 查看
这题也是小白书P144上看来的,这题链表还不算太难,但是细节处理也是比较麻烦,重点是那个link函数。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int left1[100005],right1[100005]; void link(int L,int R) { left1[R]=L; right1[L]=R; } int main() { int n,m,kase=0; while(~scanf("%d %d",&n,&m)) { for(int i=1; i<=n; i++) { left1[i]=i-1; right1[i]=(i+1)%(n+1); } left1[0]=n; right1[0]=1; int op,X,Y,cnt=0; while(m--) { scanf("%d",&op); if(op==4) { cnt=!cnt; } else { scanf("%d %d",&X,&Y); int LX=left1[X],RX=right1[X],LY=left1[Y],RY=right1[Y]; if(op==3) { if(LX==Y) { link(LY,X); link(X,Y); link(Y,RX); } else if(RX==Y) { link(LX,Y); link(Y,X); link(X,RY); } else { link(LX,Y); link(Y,RX); link(LY,X); link(X,RY); } continue; } if((op==1||op==2)&&cnt) op=3-op; if(op==1) { if(left1[Y]==X) continue; else { link(LY,X); link(X,Y); link(LX,RX); } } else if(op==2) { if(right1[Y]==X) continue; else { link(LX,RX); link(Y,X); link(X,RY); } } } } long long a=0; int b=0; for(int i=1; i<=n; i++) { b=right1[b];//每个数右边的数 if(i%2) a+=b;//判断是否是奇数位上的数 } if(cnt&&n%2==0) a=(long long)n*(n+1)/2-a; printf("Case %d: %lld\n",++kase,a); } return 0; }
相关文章推荐
- 移动盒子(Boxes in a Line, UVa 12657) 关于STL中list(双向链表的应用)
- UVA 12657 Boxes in a Line( 双向链表 )
- UVa 12657 - Boxes in a Line ( 双向链表 )
- 【解题报告】uva103_Stacking Boxes(堆砌盒子, dp)
- UVA 12657 Boxes in a Line 双向链表
- 链表-双向链表&&UVa12657 Boxes in a Line(移动盒子)的理解与解析
- UVa 12657 Boxes in a Line 数组模拟双向循环链表
- UVA 12657 Boxes in a Line【双向链表】
- UVa 12657 Boxes in a Line(双向链表的应用)
- Uva 12657 Boxes in a Line 链表 模拟
- UVA12657解题报告
- uva12657 Boxes in a Line 双向链表
- 【日常学习】【模拟双向链表】【疑问】Uva12657 - Boxes in a Line题解
- UVA 12657 Boxes in a Line 【双向链表】
- UVA12657 Boxes in a Line【双向链表】【数组模拟】
- 【数组模拟链表(双向)】UVA - 12657 Boxes in a Line
- UVALive 5797解题报告
- UVA - 12657 Boxes in a Line(双向链表)
- POJ 3150 / Uva 1386 Cellular Automaton 解题报告(循环矩阵)
- UVA11090 Going in Cycle!! 解题报告【判负环】【SPFA】【二分答案】