UVa--12657 Boxes in a line(双向链表)
来源:互联网 发布:淘宝客阿里云建站教程 编辑:程序博客网 时间:2024/05/01 02:24
UVA--12657
题解:
lrj大法。
采用双向链表,编号为 i 的的盒子左右两边的盒子编号分别为 left[i] 和 right[i] 。
技巧:操作4反转需要修改所有元素的指针,为避免时间消耗,增加一个标记 inv, 表示有无反转,这样就并不需要真的去执行操作4.
inv = 1表示奇数次反转,inv = 0表示偶数次反转。当inv = 1的时候,操作1和2需要反过来,操作3不受inv取值的影响。
注意操作3,相邻的两个结点和不相邻的两个结点的交换,其连接方式是不同的。
//running time: 0.093s#include <iostream>#include <cstdio>#include <algorithm>const int maxn = 100000 + 10;int n, m;int left[maxn], right[maxn];void inline link(int l, int r) //两个结点相互连接,l在r的左边,r在l的右边{ right[l] = r, left[r] = l;}int main(){ #ifdef LOCAL freopen("data.in", "r", stdin); #endif // LOCAL int kcase = 0; while(std::cin >> n >> m) { //初始化 for(int i = 1; i <= n; ++i) { left[i] = i - 1; right[i] = i + 1; } right[0] = 1, left[0] = n, right[n] = 0; int op, x, y, inv = 0; for(int i = 0; i < m; ++i) { scanf("%d", &op); if(op == 4){ inv = !inv; continue; } scanf("%d %d", &x, &y); if(op == 3 && x == right[y]) std::swap(x, y); if(op != 3 && inv) op = 3 - op; if((op == 1 && x == left[y]) || (op == 2 && x == right[y])) continue; int lx = left[x], rx = right[x], ly = left[y], ry = right[y]; //move x to the left of y, actually the link relation of x and y modified if(op == 1){ link(lx, rx); link(ly, x); link(x, y); } //move x to the right of y else if(op == 2){ link(lx, rx); link(y, x); link(x, ry); } //swap x and y else if(op == 3){ if(y == right[x]) { link(lx, y); link(y, x); link(x, ry); } else{ link(lx, y); link(y, rx); link(ly, x); link(x, ry); } } } int b = 0; long long ans = 0; for(int i = 1; i <= n; ++i){ b = right[b]; if(i & 1) ans += b; } if(inv && n % 2 == 0) ans = (long long)n * (n + 1) / 2 - ans; printf("Case %d: %lld\n", ++kcase, ans); } return 0;}
0 0
- UVA - 12657 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(双向链表)
- UVA 12657 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(双向链表的应用)
- UVa 12657 Boxes in a Line(双向链表的应用)
- UVa 12657 Boxes in a Line(双向链表的应用)
- UVa 12657 Boxes in a Line 数组模拟双向循环链表
- UVA12657 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
- Linux环境下系统函数的使用
- 线程基础:JDK1.5+(9)——线程新特性(中)
- transient 关键字 与序列化
- usaco 3.4 Raucous Rockers 2010.8.4
- 挖个坑 - 魔法画图工具的设计
- UVa--12657 Boxes in a line(双向链表)
- 布局
- Python文档生成工具pydoc使用介绍
- PHP内置的Web Server的使用
- 红黑树
- 模拟器不能联网解决办法
- bzoj1084【SCOI2005】最大子矩阵
- 第十一章关联容器
- java 多线程实现 哲学家进餐问题