CSUOJ1329——一行盒子_湖南省第九届大学生计算机程序设计竞赛
题目是中文的我就不是说明了,比赛的时候看过题目后队友说是splay来做,细想来省赛不会出这么坑的题目吧。
于是比赛还有一个小时左右把该做的都做完了以后,我们队三个人都来思考这个题目了。不过还好很快我们就跳过了这个splay的坑。
因为这个题目根本不是spaly,直接用数组模拟链表就行了,所有的操作都可以再O(1)的时间复杂度以内搞定。
可以这样做,首先对于每一个数,我们都可以视为一个节点,然后一条链的话就相当于是指针操作了,每个节点都设置两个指针——前驱和后继。
设置后继节点是为了应对4操作,因为全部取反只要交换后继和前驱就可以了(其实不用交换也行,只要记录总共要交换多少次就行了,因为换两次就换回来了哦)
对于1、2、3就是简单的链表操作了,不过注意3操作有一个坑,就是x和y可能是相邻的两个节点哦,特别注意了,这里有点坑的。
不过说了,上代码,这个题目时间虽然是O(n),但是时间还不算宽哦,所以写的时候还是注意一下比较好。
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1001000
#define ll long long
using namespace std; int next[maxn],pre[maxn],n,m,k,tim;
int *tep,*tep2; void init_next_pre()
{
for (int i=; i<=n; i++) next[i]=i+,pre[i]=i-;
next[n]=;
} void dele(int x)
{
int k1=pre[x],k2=next[x];
next[k1]=k2,pre[k2]=k1;
} void insert(int k1,int mid,int k2)
{
next[k1]=mid,next[mid]=k2;
pre[k2]=mid,pre[mid]=k1;
} void SWAP(int x,int y)
{
int k1=pre[x],k2=next[x],k3=pre[y],k4=next[y];
if (k2==y)//考虑xy相邻的情况
{
next[k1]=y,next[y]=x,next[x]=k4;
pre[k4]=x,pre[x]=y,pre[y]=k1;
}
else if (k4==x)//考虑xy相邻的情况
{
next[k3]=x,next[x]=y,next[y]=k2;
pre[k2]=y,pre[y]=x,pre[x]=k3;
}
else
{
next[k1]=y,next[y]=k2,pre[y]=k1,pre[k2]=y;
next[k3]=x,next[x]=k4,pre[x]=k3,pre[k4]=x;
}
} int main()
{
int cod,x,y,cas=;
while (cin>>n>>m)
{
tim=;
init_next_pre();
while (m--)
{
cin>>cod;
if (cod==) tim++;//这里只要记录首位交换了多少次哦
else
{
cin>>x>>y;
if (cod< && tim&) cod=-cod;//如果交换了奇数次,那么本来应该插在前面就相当于是现在应该插在后面,T_T不好怎么表达,自己理解一下就懂了。
if (cod==)
{
dele(x);
k=pre[y];
insert(k,x,y);
}
else if (cod==)
{
dele(x);
k=next[y];
insert(y,x,k);
}
else if (cod==) SWAP(x,y);
}
}
if (tim&) tep=pre,tep2=next; else tep=next,tep2=pre;
for (int i=; i<=n; i++)
{
if (tep2[i]==)
{
ll ans=;
for (int k=; i; i=tep[i],k++) if (k&) ans+=i;
cout<<"Case "<<++cas<<": "<<ans<<endl;
break;
}
}
}
return ;
}
CSUOJ1329——一行盒子_湖南省第九届大学生计算机程序设计竞赛的更多相关文章
- 湖南省第九届大学生计算机程序设计竞赛 Interesting Calculator
Interesting Calculator Time Limit: 2 Sec Memory Limit: 128 MB Submit: 163 Solved: 49 Description T ...
- 湖南省第十三届大学生计算机程序设计竞赛 Football Training Camp 贪心
2007: Football Training Camp[原创-转载请说明] Submit Page Summary Time Limit: 1 Sec Memory Limit: 1 ...
- 2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情
Description 已知以下 4 种都是卖萌表情(空白的部分可以是任意字符.竖线是便于展示的分隔符,没有实际意义): ^ ^ | ^ | < | > v | v v | > | ...
- 2018湖南省第14届大学生计算机程序设计竞赛 C: 时间旅行
Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中. 当 Bobo 位于时间轴上 t 点,同时时间机器有 c 单位燃料时,他可以选择一个 ...
- 2018湖南省第14届大学生计算机程序设计竞赛 A字符画
Description 读入 w,请输出 2018 的字符画,两个数字之间有 w 个空格.具体格式请参考样例输出. 1 ≤ w ≤ 2018 Input 输入文件只包含 1 个整数 w. Output ...
- 希尔加密算法(湖南师范大学第六届大学生计算机程序设计竞赛)hnuoj11552
解密 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 2, Accept ...
- csu 1503: 点弧之间的距离-湖南省第十届大学生计算机程序设计大赛
这是--比量p并用交点连接中心不上弧.在于:它至p距离.是不是p与端点之间的最短距离 #include<iostream> #include<map> #include< ...
- 2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解
2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解 update10.01 突然发现叉姐把这场的题传到牛客上了,现在大家可以有地方提交了呢. 不知道该干什么所以就来水一篇题解 ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
随机推荐
- 20155231 实验二 Java面向对象程序设计
20155231 java实验一 Java开发环境的熟悉 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 完成实验.撰写实验 ...
- 20155305乔磊2016-2017-2《Java程序设计》第四周学习总结
20155305乔磊2016-2017-2<Java程序设计>第四周学习总结 教材学习内容总结 继承 继承就是避免多个类间重复定义共同行为. 面向对象中,子类继承父类,就是把程序中相同的代 ...
- 20155315 2016-2017-2 《Java程序设计》第二周学习总结
教材学习内容总结 在教材中,有一句话叫做 伪代码是最好的注释. 一开始我不理解什么是伪代码,但在参考了百度和C语言的学习过程后,我发现伪代码的作用就相当于是解决问题前期的流程图设计,伪代码设计好了之后 ...
- WPF使用IDataErrorInfo接口进行数据校验 - 简书
原文:WPF使用IDataErrorInfo接口进行数据校验 - 简书 class ValidationBindableBase : BindableBase, IDataErrorInfo { pu ...
- (三)SpringBoot2.0基础篇- 持久层,jdbcTemplate和JpaRespository
一.介绍 SpringBoot框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate的直接JDBC访问到完整的“对象关系映射”技术(如Hibernate).Spring-data-jp ...
- idea alt+enter导包时被锁定导某一个包时的解决方法
在只有一个包指向的时候,把光标放在Test这种字符之间的话 就会直接导这个 所以把光标放在最后就可以导别的了
- python-编程从入门到实践
python-编程从入门到实践 1.python文件后缀名: .py 是Python的源码文件,由Python.exe解释. .pyc 是Python的编译文件.pyc 文件往往代替 py 文件发布: ...
- springMVC 第一章
springMVC 第一章 一.分层结构的项目 组成方式: 表示层:页面,Servlet 业务层:业务逻辑类(service) 持久层:与数据库交互的类(dao) 程序执行的过程:表示层->se ...
- MATLAB 笔记
MATLAB的学习 Matlab 主要有5大部分构成,分别是MATLAB语言,桌面工具与开发环境,数学函数库 ,图形系统和应用程序接口.以及众多的专业工具.
- leetcode个人题解——#36 valid Sudoku
思路题目里已经给出来了,判断是否是一个有效数独,只需满足以下三个条件: 1.同行元素不重复且1-9都有: 2.同列元素不重复且1-9都有: 3.每个粗线分隔的3*3的小九宫格元素不重复且1-9都有. ...