1329: 一行盒子

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 693  Solved: 134
[Submit][Status][Web
Board
]

Description

你有一行盒子,从左到右依次编号为1, 2, 3,…, n。你可以执行四种指令:

1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令)。
2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令)。
3 X Y表示交换盒子X和Y的位置。
4 表示反转整条链。

指令保证合法,即X不等于Y。例如,当n=6时在初始状态下执行1 1 4后,盒子序列为2 3 1 4 5 6。接下来执行2 3 5,盒子序列变成2 1 4 5 3 6。再执行3 1 6,得到2 6 4 5 3 1。最终执行4,得到1 3 5 4 6 2。

Input

输入包含不超过10组数据,每组数据第一行为盒子个数n和指令条数m(1<=n,m<=100,000),以下m行每行包含一条指令。

Output

每组数据输出一行,即所有奇数位置的盒子编号之和。位置从左到右编号为1~n。

Sample Input

6 41 1 42 3 53 1 646 31 1 42 3 53 1 6100000 14

Sample Output

Case 1: 12Case 2: 9Case 3: 2500050000

第一次做这类型的题,真的有蛮坑的,特别是SAWP操作,情况漏考虑就是死循环,唉,做个模板用吧。。。这题两点要注意,一是我们只要在逻辑上面进行翻转
即可,如果是奇数次,那么只要将1操作看成2操作,2操作看成1操作即可。然后最后输出的时候也只要奇数次翻转就从尾部开始算,偶数次就从头部开始算。
swap(x,y)一定要考虑 next[x] = y和next[y] = x两种情况。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
int n,m;
int chi[maxn],pre[maxn]; void init()
{
pre[] = ;
for(int i = ; i <= n; i++)
pre[i] = i - ;
for(int i = n-; i >= ; i--)
chi[i] = i + ;
chi[n] = ;
}
void left(int x,int y){ ///将x 移到y的左边
if(pre[y]==x) return;
int p = pre[x]; //x的父亲节点
pre[chi[x]] = p,chi[p] = chi[x];
p = pre[y],chi[p] = x;
pre[x] = p,chi[x] = y,pre[y] = x;
}
void right(int x,int y){ ///将x移向y的右边
if(chi[y]==x) return;
int p = pre[x]; //x的父亲节点
pre[chi[x]] = p,chi[p] = chi[x];
pre[x] = y,chi[x] = chi[y];
pre[chi[y]] = x,chi[y] = x;
}
void Swap(int x,int y){ ///链表的交换操作
int p1 = pre[x],p2 = pre[y];
int c1 = chi[x],c2 = chi[y];
if(chi[x]==y){
chi[p1]=y,chi[y]=x,chi[x]=c2;
pre[c2]=x,pre[x]=y,pre[y]=p1;
}else if(chi[y]==x){
chi[p2]=x,chi[x]=y,chi[y]=c1;
pre[c1]=y,pre[y]=x,pre[x]=p2;
}else{
chi[p1] = y,pre[y] = p1;
chi[y] = c1,pre[c1] = y;
chi[p2] = x,chi[x] = c2;
pre[c2] = x,pre[x] = p2;
}
}
int main()
{
//freopen("b.in","r",stdin);
//freopen("b.txt","w",stdout);
int op,x,y;
int cnt = ,cas=;
while(scanf("%d %d",&n,&m)!=EOF)
{
init();
cnt = ;
while(m--)
{
scanf("%d",&op);
if(op==) cnt++;
else
{
if(op<&&cnt%==) op = -op;
if(op == )
{
scanf("%d %d",&x,&y);
left(x,y);
}
else if(op == )
{
scanf("%d %d",&x,&y);
right(x,y);
}
else if(op == )
{
scanf("%d %d",&x,&y);
Swap(x,y);
}
} }
long long ans = ;
if(cnt % == ) //翻转了
{
int head;
for(int i = ; i <= n; i++)
if(chi[i] ==)
{
head = i;
break;
}
int f = ;
while(pre[head] != )
{
if(f%==) ans+=head;
head = pre[head];
f++;
}
if(f%==) ans+=head;
}
else
{
int head;
for(int i = ; i <= n; i++)
if(pre[i] == )
{
head = i;
break;
}
int f = ;
while(chi[head] !=)
{
if(f%==) ans+=head;
head = chi[head];
f++;
}
if(f%==) ans+=head;
}
printf("Case %d: %I64d\n",cas++,ans);
}
return ;
}

csu 1329 一行盒子(链表操作)的更多相关文章

  1. CSU 1329: 一行盒子

    1329: 一行盒子 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 740  Solved: 145[Submit][Status][Web Board ...

  2. csuoj 1329: 一行盒子

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329 1329: 一行盒子 Time Limit: 1 Sec  Memory Limit: 12 ...

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

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

  4. B - 一行盒子

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

  5. SWUSTOJ 960A题总结,又完成一个讨厌的题,内含链表操作启发

    今天debug了一个nice代码,先码在这里,SWUST OJ960 双向链表的操作问题 1000(ms) 10000(kb) 2994 / 8244 建立一个长度为n的带头结点的双向链表,使得该链表 ...

  6. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  7. 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏

    数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...

  8. YTU 2620: B 链表操作

    2620: B 链表操作 时间限制: 1 Sec  内存限制: 128 MB 提交: 418  解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...

  9. C# 链表操作

    关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...

随机推荐

  1. mysqldump备份恢复

    数据库的备份恢复是DBA的必修课,本文首先讲解mysqldump完整备份恢复的操作方法,演示数据库完整备份的基本过程.然后再模拟数据库遭遇灾难性破坏,配合bin-log日志实验数据库灾难性恢复的步骤. ...

  2. Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)

    1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...

  3. bzoj1969: [Ahoi2005]LANE 航线规划(树链剖分)

    只有删边,想到时间倒流. 倒着加边,因为保证图连通,所以一开始一定至少是一棵树.我们先建一棵树出来,对于每一条非树边,两个端点在树上这段路径的边就不会变成关键边了,所以将它们对答案的贡献删去,那么直接 ...

  4. [CEOI2004]锯木厂选址

    link 试题分析 做这种题就应该去先写个暴力代码 #include<iostream> #include<cstring> #include<cstdio> #i ...

  5. Linux之静态库与动态库20160706

    所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源..so文件是共享库文件(动态 ...

  6. jQuery 前端实现手机验证码

    html <input id="phone" type="text" name="phone"> <input id=&q ...

  7. HDU--2962

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 分析:最短路+二分. #include<iostream> #include< ...

  8. hdu6166 Senior Pan

    Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  9. Java Socket UDP编程

    package com; import java.io.IOException; import java.net.*; /** * UDP Client * * Created by Administ ...

  10. bzoj 1030 AC自动机+dp

    代码: //先把给的单词建AC自动机并且转移fail,然后d[i][j]表示构造的文章到第i位时处在字典树的第j个节点的不包含单词的数量,最后用总的数量26^m //-d[m][0~sz]即可.其中不 ...