UVa 12657 Boxes in a Line(应用双链表)
Boxes in a Line
You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simulate 4
kinds of commands:
• 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.
Commands are guaranteed to be valid, i.e. X will be not equal to Y .
For example, if n = 6, after executing 1 1 4, the line becomes 2 3 1 4 5 6. Then after executing
2 3 5, the line becomes 2 1 4 5 3 6. Then after executing 3 1 6, the line becomes 2 6 4 5 3 1.
Then after executing 4, then line becomes 1 3 5 4 6 2
Input
There will be at most 10 test cases. Each test case begins with a line containing 2 integers n, m
(1 ≤ n, m ≤ 100, 000). Each of the following m lines contain a command.
Output
For each test case, print the sum of numbers at odd-indexed positions. Positions are numbered 1 to n
from left to right.
Sample Input
6 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4
Sample Output
Case 1: 12
Case 2: 9
Case 3: 2500050000
题意 開始有n个盒子按1到n的顺序排列 对这些盒子进行m次操作 每次为把x移到y的左边 右边 交换x,y 颠倒顺序中的一个
求操作完毕后全部奇数位原盒子序号的和;
直接模拟肯定会超时 用stl中的链表也超时 仅仅能用数组自己模拟一个双向链表了 le[i],ri[i]分别表示第i个盒子左边盒子的序号和右边盒子的序号 代码中有凝视
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 100005;
int le[N], ri[N], n, m;
typedef long long ll; void link (int l, int r) //连接l和r。l在左边
{
le[r] = l; ri[l] = r;
} int main()
{
int cas = 0, op, x, y, t;
while (scanf ("%d%d", &n, &m) != EOF)
{
for (int i = 1; i <= n; ++i)
ri[i] = i + 1, le[i] = i - 1;
ri[n] = 0, le[0] = n, ri[0] = 1;
int flag = 0; //推断是否翻转
while (m--)
{
scanf ("%d", &op);
if (op == 4) flag = !flag;
else
{
scanf ("%d%d", &x, &y);
if (flag && op != 3) op = 3 - op; //翻转后移动操作就相反了
if (ri[y] == x && op == 3) //方便后面推断交换是否相邻
t = x, x = y, y = t;
if ( (op == 1 && le[y] == x) || (op == 2 && ri[y] == x)) continue; if (op == 1) //x移到y右边
link (le[x], ri[x]), link (le[y], x), link (x, y);
else if (op == 2) //x移到y左边
link (le[x], ri[x]), link (x, ri[y]), link (y, x);
else if (y == ri[x]) //op==3&&x,y相邻
link (le[x], y), link (x, ri[y]), link (y, x);
else //不相邻
{
int ry = ri[y], ly = le[y];
link (le[x], y), link (y, ri[x]), link (ly, x), link (x, ry);
}
}
} t = 0; ll ans = 0;
for (int i = 1; i <= n; ++i)
{
t = ri[t];
if (i % 2) ans += t;
}
if (n % 2 == 0 && flag) //n为偶数且翻转过 故求的恰为偶数位的和
ans = (ll) n / 2 * (1 + n) - ans;
printf ("Case %d: %lld\n", ++cas, ans);
}
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
UVa 12657 Boxes in a Line(应用双链表)的更多相关文章
- UVa 12657 Boxes in a Line(数组模拟双链表)
题目链接 /* 问题 将一排盒子经过一系列的操作后,计算并输出奇数位置上的盒子标号之和 解题思路 由于数据范围很大,直接数组模拟会超时,所以采用数组模拟的链表,left[i]和right[i]分别表示 ...
- UVA 12657 Boxes in a Line 双向链表
题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47066 利用链表换位置时间复杂度为1的优越性,同时也考虑到使用实际 ...
- UVA 12657 Boxes in a Line
双向链表 注意:如果算法是最后处理翻转情况时,注意指令4翻转后1,2两个指令也要翻转处理: 指令3 中交换盒子要注意两个盒子相邻的情况 #include <iostream> #inclu ...
- UVA 12657 Boxes in a Line(双向链表+小技巧)
题意:对于一行按照顺序排列盒子数字与位置都为 1,2,3,4....n 执行四种操作 c = 1 x 放到 y 的左边 c =2 x 放到 y 的右边 c =3 交换 x, y c =4 ...
- C - Boxes in a Line 数组模拟链表
You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simul ...
- UVa12657 - Boxes in a Line(数组模拟链表)
题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...
- uva-12657 - Boxes in a Line(双向链表)
12657 - Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to righ ...
- Boxes in a Line UVA - 12657
You have n boxes in a line on the table numbered 1...n from left to right. Your task is to simulat ...
- Problem UVA12657-Boxes in a Line(数组模拟双链表)
Problem UVA12657-Boxes in a Line Accept: 725 Submit: 9255 Time Limit: 1000 mSec Problem Description ...
随机推荐
- PatentTips - Emulating a host architecture in guest firmware
BACKGROUND The inventive subject matter relates generally to guest firmware systems, and more partic ...
- POJ3171 Cleaning Shifts DP,区间覆盖最值
题目大意.N个区间覆盖[T1,T2]及相应的代价S,求从区间M到E的所有覆盖的最小代价是多少. (1 <= N <= 10,000).(0 <= M <= E <= 86 ...
- [array] leetCode-16. 3Sum Closest -Medium
16. 3Sum Closest -Medium descrition Given an array S of n integers, find three integers in S such th ...
- Helloworld之Spring依赖注入/控制反转(DI/IoC)版
Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...
- 【跟我一起学Unity3D】代码中分割图片而且载入帧序列动画
在Cocos2dx中.对大图的处理已经封装好了一套自己的API,可是在Unity3D中貌似没有类似的API(好吧,实际上是有的,并且功能更强大),或者说我没找到. 只是这也在情理之中,毕竟Unity3 ...
- Delphi的指针(有图,很清楚)
Pointers are like jumps, leading wildly from one part of the data structure to another. Their introd ...
- NET使用ABP框架搭建项目
NET使用ABP框架搭建博客项目(一) 有很多学NET开发的小伙伴建项目都比较茫然,我用什么开发?我都使用什么框架?我怎么起名字?种种问题,让一些低等.中等的工程师(甚至是高级工程师)很烦躁. 推荐一 ...
- [Recompose] Render Nothing in Place of a Component using Recompose
Learn how to use the ‘branch’ and ‘renderNothing’ higher-ordercomponents to render nothing when a ce ...
- USB 3.0规范中译本 第3章 USB 3.0体系结构概览
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章呈现USB 3.0体系结构和关键概念的概览.USB 3.0与前面版本的USB类似,因为它是线缆总线,支持 ...
- 百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源
个人官网.公司项目都需要 可视化编辑器,百度UEditor做得很不错,就用的这个.项目后台用到了SpringMVC.Freemarker,开发过程中部署在Jetty,线上部署用Tomcat,最后可能配 ...