csu 1329 一行盒子(链表操作)
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 一行盒子(链表操作)的更多相关文章
- CSU 1329: 一行盒子
1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 740 Solved: 145[Submit][Status][Web Board ...
- csuoj 1329: 一行盒子
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1329 1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 12 ...
- CSUOJ 1329 一行盒子(数组模拟链表)
题目:id=1329">http://acm.csu.edu.cn/OnlineJudge/problem.php? id=1329 题意: watermark/2/text/aHR0 ...
- B - 一行盒子
Description 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子 ...
- SWUSTOJ 960A题总结,又完成一个讨厌的题,内含链表操作启发
今天debug了一个nice代码,先码在这里,SWUST OJ960 双向链表的操作问题 1000(ms) 10000(kb) 2994 / 8244 建立一个长度为n的带头结点的双向链表,使得该链表 ...
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏
数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...
- YTU 2620: B 链表操作
2620: B 链表操作 时间限制: 1 Sec 内存限制: 128 MB 提交: 418 解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...
- C# 链表操作
关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...
随机推荐
- Sqli-labs之sql注入基础知识
(1)注入的分类 基于从服务器接收到的响应 ▲基于错误的SQL注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL盲注 •基于布尔SQL盲注 •基于时间的SQL盲注 •基于报错的SQL盲注 基于如何处理输 ...
- Yarn 模式 与 电影受众分析系统
yarn模式分为两种模式: 一.Yarn-cluster模式 1.通过spark-submit提交spark jar包(Application),与RM进行通信请求启动AM 2.RM接收到请求之后,会 ...
- 《剑指offer》— JavaScript(6)旋转数组的最小数字
旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2, ...
- 使用 css 的 keyframe 实现 loading 动画
效果查看:https://jsfiddle.net/rubys/je16qL5k/6/ <!DOCTYPE html> <html lang="en"> & ...
- 前端PHP入门-005-爱情是常量还是变量
常量 常--汉语字面为:长久,经久不变. 常量那就好翻译了:长久不变的值. 常量的使用范围非常广泛. 我们在以后,定义我们的工作目录.定义一些特点的帐户密码.版本号等我们都会使用到常量.所以这一块的知 ...
- SpringCloud学习(1)——SpringCloud概述
微服务架构: 微服务架构是一种架构模式或者说是一种架构风格, 他提倡将单一应用程序划分成一组小的服务, 每个服务运行在其独立的进程中, 服务之间互相协调,互相配合, 为用户提供最终价值.服务之间采用轻 ...
- LeetCode-Sort List[AC源码]
package com.lw.leet4; /** * @ClassName:Solution * @Description: * Sort List * Sort a linked list in ...
- npm 的使用指南
npm 使用指南 因为有写关于node.js的配置的博客,还有node和gulp的前端信息配置使用,其中有很多命令都用到了npm.所以这里要着重介绍一下npm. 1 npm介绍 npm(mode pa ...
- vector的哈希值 Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) C
http://codeforces.com/contest/757/problem/C 题目大意:有n个导管,每个体育馆有k种神奇宝贝,然后所有的n个体育馆中,一共有m中神奇宝贝.可知,每个神奇宝贝中 ...
- IO流-文件拷贝
其实文件的拷贝还是文件读取写入的应用,实际是读取此路径上的文件,然后写入到指定路径下的文件. 代码举例: import java.io.*; import java.lang.*; class Tes ...