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

四种操作,1把x移到y左边,2把x移到y右边,3交换xy,4逆转链表;

用数组模拟链表,用LEFT和RIGHT两个数组储存每一个数字左右两边的数字是什么

如果有经过一次4,那个做个标记,后面有操作1,2就要交换,1要变成2,2要变成1,3没影响,对他们的左右连接改动就好了,和链表的操作一样

吐槽一句,刘汝佳有毒啊,他书上的代码会wa,后面还是自己写出来过的

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
//#include<map>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
typedef long double ld;
typedef double db;
const ll mod=1e9+100;
const db e=exp(1);
using namespace std;
const double pi=acos(-1.0);
int n,LEFT[100010],RIGHT[100010];
void link(int x,int y)
{
LEFT[y]=x;
RIGHT[x]=y;
}
int main()
{
int m,kase=0;
while(sf("%d%d",&n,&m)!=EOF)
{
rep(i,1,n+1)
{
LEFT[i]=i-1;
RIGHT[i]=(i+1)%(n+1);
}
RIGHT[0]=1;LEFT[0]=n;
int op,x,y,temp=0;
while(m--)
{
sf("%d",&op);
if(op==4) temp=!temp;
else
{
sf("%d%d",&x,&y);
if(op==3&&RIGHT[y]==x) swap(x,y);
if(op!=3&&temp) op=3-op;
int lx=LEFT[x],rx=RIGHT[x],ly=LEFT[y],ry=RIGHT[y];
if(op==1)
{
if(LEFT[y]!=x)
{
if(RIGHT[y]==x)
{
link(y,rx);link(ly,x);link(x,y);
}else
{
link(lx,rx);link(x,y);link(ly,x);
}
}
}else if(op==2)
{
if(RIGHT[y]!=x)
{
if(LEFT[y]==x)
{
link(lx,y);link(y,x);link(x,ry);
}else
{
link(lx,rx);link(y,x);link(x,ry);
}
}
}else if(op==3)
{
if(RIGHT[x]==y)
{
link(lx,y);link(y,x);link(x,ry);
}else if(RIGHT[y]==x)
{
link(ly,x);link(x,y);link(y,rx);
}else
{
link(lx,y);link(y,rx);link(ly,x);link(x,ry);
}
}
}
}
int b=0;
ll ans=0;
rep(i,1,n+1)
{
b=RIGHT[b];
if(i%2==1) ans+=b;
}
if(temp&&n%2==0) ans=(ll)n*(n+1)/2-ans;
pf("Case %d: %lld\n",++kase,ans);
}
return 0;
}

C - Boxes in a Line 数组模拟链表的更多相关文章

  1. UVa12657 - Boxes in a Line(数组模拟链表)

    题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...

  2. UVA11988-Broken Keyboard(数组模拟链表)

    Problem UVA11988-Broken Keyboard Accept: 5642  Submit: 34937 Time Limit: 1000 mSec Problem Descripti ...

  3. B - Broken Keyboard (a.k.a. Beiju Text) 数组模拟链表

    You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...

  4. PAT 甲级 1052 Linked List Sorting (25 分)(数组模拟链表,没注意到不一定所有节点都在链表里)

    1052 Linked List Sorting (25 分)   A linked list consists of a series of structures, which are not ne ...

  5. 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 ...

  6. 天梯赛 L2-022. (数组模拟链表) 重排链表

    题目链接 题目描述 给定一个单链表 L1→L2→...→Ln-1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln-1→L2→....例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2 ...

  7. CSUOJ 1329 一行盒子(数组模拟链表)

    题目:id=1329">http://acm.csu.edu.cn/OnlineJudge/problem.php? id=1329 题意: watermark/2/text/aHR0 ...

  8. josephus Problem 中级(使用数组模拟链表,提升效率)

    问题描写叙述: 在<josephus Problem 0基础(使用数组)>中.我们提出了一种最简单直接的解决方式. 可是,细致审视代码之后.发现此种方案的效率并不高,详细体如今.当有人出局 ...

  9. UVa 11988 (数组模拟链表) Broken Keyboard (a.k.a. Beiju Text)

    题意: 模拟一个文本编辑器,可以输入字母数字下划线,如果遇到'['则认为是Home键,如果是']'则认作End键. 问最终屏幕上显示的结果是什么字符串. 分析: 如果在数组用大量的移动字符必然很耗时. ...

随机推荐

  1. 你应该更新的 Java 知识之常用程序库【转载】

    在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进.如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东 ...

  2. 摄像专用的SD卡推荐

      此类SD卡主要需要满足快速写入:特别对于4K的支持,速度要有很高才能满足. 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  3. Ubuntu下搭建tftp服务器最简单方法

    今天开始调试ARM的板子,要通过tftp下载到板子上,所以又要配置tftp服务器,真的烦死了… (本人酷爱装系统,所以经常都要搞配置) 因为之前已经在Ubuntu下搭建过很多次tftp服务器了,但是一 ...

  4. Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点( FROM IBM)

    Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点 菜单是各种软件及开发平台会提供的必备功能,Eclipse 也不例外,提供了丰富的菜单,包括主菜单(Main Menu),视图 / ...

  5. 使用Kotlin优雅的开发Android应用

    来源:https://juejin.im/post/5915c0a744d904006c4e3bcd demo下载地址:https://github.com/xiehui999/KotlinForAn ...

  6. 将iPhone5s中的相片批量下载到电脑中

    前言:目前我还在使用iPhone5s这款手机,不过由于自己的无知,在使用手机的过程中发现有些用户的体验不是很好,特别是将手机中的相片批量下载到电脑中这件小事,和Android系统相关的手机相比更不好玩 ...

  7. 判断Android 当前版本是否为debug版本

    public static boolean isDebugVersion(Context context) { try { ApplicationInfo info = context.getAppl ...

  8. JS放在博客里面运行

    <ol><li>测试的内容</li><li>测试的内容</li><li>测试的内容</li><li>测试 ...

  9. http_referer 白名单

    valid_referers none blocked *.ttlsa.com server_names ~\.image\. ~\.baidu\.; if ($invalid_referer) { ...

  10. HTML5学习笔记(二十八):跨域

    在跨域安全性方面,有多个地方会有限制,主要是XMLHttpRequest对象的跨域限制和iFrame的跨域限制,下面我们分别来看一下. Ajax跨域(CORS) CORS是一个W3C标准,全称是&qu ...