2021夏季学期华清大学EE数算OJ2:难缠的店长
2021年夏季学期华清大学电子系数算oj2题解
某知名oier锐评蒟蒻的oj1题解:
话不多说,进入oj2题解:
难缠的oj 之 难缠的店长
当时读完我已经因为无良甲方的行为出离愤怒了!但是做题还是要做!
1.建立链表
本题实际上是链表模板题,但是据学长反映,用我们在《程序设计基础》中接触的以结构体,指针构造节点的办法,并不能ac此题! 回想一下,其实我们在结构体中,存储了指向下一个节点的指针。那么,有没有其他的办法,使得我们可以记录下一个节点的位置呢? 在数组中,我们可以通过下标索引的方法快速访问指定元素。那么,也就是说,我们只要把下一节点的下标想办法存在当前节点,就可以达到与传统链表一样的功能了! 因此,我们只需要再init一个数组,用于存储下一节点的下标,就可以实现常数更优化的访问了!
但是,我们仔细读题发现,店长的要求非常混乱:不仅要添加,删除,调换,甚至要改变全序。这时候,我们发现单向的链表并不能满足题目的要求了。但这并不构成困难,我们只需再init一个数组,构成双向链表结构即可。 然后,我们按照数算老师课上的要求:先继承再添加的原则,一步一步实现题目要求的功能。
理论上,我们需要三个数组:a[i]用于存储当前节点的值,l[i]用于存储当前节点的上一节点的下标,r[i]用于存储当前节点的下一节点的下标。但是,由于本题中恰好有物体的编号从1到n,定义域等于值域,因此可以少建立一个数组,用两个数组实现链表。
2.实现题目要求的功能
2.1 添加节点
添加的物品分为,添加到右边的物体和添加到左边的物体,原理大体相同,现在以把物体添加到左边为例:
首先,为了使得我们从始至终都只有“向一个链表中添加节点”而不存在“从0到1个节点”的过程,我们先初始化两个边界节点,这里我使用了下标0和下标n+1。也就是说,这两个节点始终作为首尾节点存在着,这使得我们不用了考虑建立一个链表的问题。


int i,j,lorr;read(i),read(j),read(lorr);
if(lorr==num){l[i]=l[j],r[l[j]]=i,r[i]=j;l[j]=i;}
else if(lorr==-1){r[0]=i;r[i]=n+1;l[n+1]=i;l[i]=0;}
else{r[i]=r[j];l[r[j]]=i;l[i]=j;r[j]=i;}
如这段代码写的这样,我们在添加节点时,先把原来存在的指针(此处把下标索引称为指针了)继承下来,然后再按照情况添加新的。注意不要漏写,必须保证每个节点与左右节点都是双向的。
2.2 删除节点
删除节点与添加节点几乎同理,仍然是对l,r数组进行操作。


int ri=r[i],li=l[i];
l[ri]=li,r[li]=ri;l[i]=0;r[i]=0;
此处不进行冗余的解释。
2.3 调换操作
按照我们前两步的思维,调换节点无非就是删除两个节点,再添加两个节点。确实,对于大多数节点,这样的做法是正确的。但是,如果你要调换的两个节点正好相邻,那么,由于删除和添加操作都涉及到对相邻节点的操作,可能会出现问题。可能不会,我不知道,请自行实践。因此,对于相邻的节点,我们可以引入特判。


int i,j;read(i),read(j);
if(r[i]==j){
int li=l[i],rj=r[j];
r[li]=j,l[rj]=i,r[j]=i,l[i]=j,r[i]=rj,l[j]=li;
}
else if(r[j]==i){
int ri=r[i],lj=l[j];
r[lj]=i,l[ri]=j,r[i]=j,l[j]=i,r[j]=ri,l[i]=lj;
}
else{
int li=l[i],ri=r[i],lj=l[j],rj=r[j];
r[li]=j,l[j]=li,l[ri]=j;r[j]=ri;
r[lj]=i,l[i]=lj,l[rj]=i,r[i]=rj;
}
2.4 改变全序
看起来这一步最为丧心病狂,但是,实际上,只要我们记住当前翻转的总次数,然后按照需要的顺序输出就好了!


else if(boo==-2){num++;num=num&1;}
附上ac代码


#include<cstdio>
#include<ctype.h>
using namespace std;
int l[200005],r[200005];
inline void read(int&x){
char c,f=x=0;
while(!isdigit(c=getchar()))f=c=='-';
while(isdigit(c))x=x*10-48+c,c=getchar();
if(f)x=-x;
}
int main(){
int n,m,k,u,num=0;read(n),read(m),read(k),read(u);
r[0]=n+1;l[n+1]=0;
for(int i=1;i<=n+m+k+u;i++){
int boo;read(boo);
if(boo==1){
int i,j,lorr;read(i),read(j),read(lorr);
if(lorr==num){l[i]=l[j],r[l[j]]=i,r[i]=j;l[j]=i;}
else if(lorr==-1){r[0]=i;r[i]=n+1;l[n+1]=i;l[i]=0;}
else{r[i]=r[j];l[r[j]]=i;l[i]=j;r[j]=i;}
}
else if(!boo){
int i;read(i);
int ri=r[i],li=l[i];
l[ri]=li,r[li]=ri;l[i]=0;r[i]=0;
}
else if(boo==-1){
int i,j;read(i),read(j);
if(r[i]==j){
int li=l[i],rj=r[j];
r[li]=j,l[rj]=i,r[j]=i,l[i]=j,r[i]=rj,l[j]=li;
}
else if(r[j]==i){
int ri=r[i],lj=l[j];
r[lj]=i,l[ri]=j,r[i]=j,l[j]=i,r[j]=ri,l[i]=lj;
}
else{
int li=l[i],ri=r[i],lj=l[j],rj=r[j];
r[li]=j,l[j]=li,l[ri]=j;r[j]=ri;
r[lj]=i,l[i]=lj,l[rj]=i,r[i]=rj;
}
}
else if(boo==-2){num++;num=num&1;}
}
if(num){int i=n+1;while(l[i]){printf("%d ",l[i]);i=l[i];}}
else {int i=0;while(r[i]-n-1){printf("%d ",r[i]);i=r[i];}}
printf("-1");
}
通过快读得到了60ms的坏成绩
2021夏季学期华清大学EE数算OJ2:难缠的店长的更多相关文章
- 2021夏季学期华清大学EE数算OJ1:算数问题
第一次写博客,有点紧张... 也许格式也没有特别丑吧 先看原题( 此题做法众多,这里仅仅介绍蒟蒻的一种很复杂的思路(但最后还是喜提0ms的好成绩) 读完这道题,不难发现,此题不过是一个质因数分解+一堆 ...
- 2021春季学期华清大学EE数算OJ3:岩石的重量
原题目如下: 看起来,这不过是我们在<程序设计基础>里面接触过的简单动态规划问题(什么,你不知道什么叫动态规划? 什么是动态规划? 百度百科对"动态规划"一词定义如下: ...
- 毕业样本=[华威大学毕业证书]Warwick原件一模一样证书
华威大学毕业证[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...
- 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级
近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...
- 基于华清远见STM32f051的 IIC从模式实现方法
作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...
- 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版
2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...
- [华清远见]FPGA公益培训
本套视频教程为华清远见 网络公益培训活动,主讲人:姚远老师,华清远见高级讲师. ------------------------------------------------------------ ...
- 华清远见Linux设备驱动(每章小结)
1. linux设备驱动是以内核模块的方式而存在的,在具体的驱动开发中将驱动编译为模块具有很到的工程意义.因为如果将正在开发中的驱动编译如内核,而开发过程中会不断修改驱动代码,则需要不断的编译和重启 ...
- hdu 5228 OO’s Sequence(单独取数算贡献)
Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...
随机推荐
- 学习Kvm(二)
一.走进云计算 云计算:云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供, ...
- Redis++:Redis做分布式锁真的靠谱吗
Redis做分布式锁真的靠谱吗 Redis的分布式锁可以通过Lua进行实现,通过setnx和expire命令连用的方式 || 也可以使用高版本的方法同时设置失效时间,但是假如在以下情况下,就会造成无锁 ...
- 关于CPU、指令集、架构、芯片的一些科普
作者:王强链接:https://zhuanlan.zhihu.com/p/19893066来源:知乎 随着智能设备的广泛普及,这几年媒体上越来越多的出现关于"架构""AR ...
- 4.7 ROS分布式通信
4.7 ROS分布式通信 ROS是一个分布式计算环境.一个运行中的ROS系统可以包含分布在多台计算机上多个节点.根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信. 因此,ROS对网络配置 ...
- 前端每日实战:144# 视频演示如何用 D3 和 GSAP 创作一个集体舞动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gdVObN 可交互视频 此视频是可 ...
- Service worker (@nuxtjs/workbox) 采坑记
PWA(Progressive Web App)是前端的大趋势,它能极大的加快前端页面的加载速度,得到近乎原生 app 的展示效果(其实难说).PWA 其实是多种前端技术的组合,其中最重要的一个技术就 ...
- hive启动出错
Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument - 狗子的进阶史 - ...
- java中StringBuffer的用法
2.StringBuffer StringBuffer:String类同等的类,它允许字符串改变(原因见上一段所说).Overall, this avoids creating many tempor ...
- dotnet new 命令笔记
让dotnet new使用平台特定的目标,例如net6.0-windows10.0.19041.0 dotnet new console --name CallWinRTConsole --frame ...
- caioj 1001: [视频]实数运算1[水题]
题意:输入两个实数a和b,输出它们的和 题解:简单题不写题解了-- 代码: #include <cstdio> double a, b; int main() { while (~scan ...