数据结构 hbb(汉堡包)

问题描述

  汉堡包有收集汉犇犇的癖好,它喜欢把汉犇犇一个叠一个的放置。
  因为它有强迫症,所以每当它想放一个新的汉犇犇进去的时候并不一定想直
接叠在最上面,简单的说,当他想放第 A 个新的汉犇犇的时候,他想把它插入到
汉犇犇 Ai(保证汉犇犇 Ai 存在)的上面;
  除此之外,有时候他会吃掉收集的部分汉堡包,因为不满足于只吃一个,每
次会吃掉某个汉犇犇开始,往上连续的 x(x>=1)个汉犇犇。
  给定 n 个操作,输出 n 个操作后活下来的汉犇犇的编号(从最底下的汉犇犇
开始到最顶):

1 a    : 1 代表一个新的汉犇犇(第一个出现的汉犇犇编号为 1,第二个为 2,以此类推),汉堡包想把他放在编号为 a 的汉犇犇上面,如果不存在编号 a的汉犇犇,则放在所有汉犇犇的最上面即可;

2 a b : 2 代表汉堡包想吃掉编号 a 的汉犇犇开始(如果 a 不存在则从最底下的汉堡包开始),按叠好的顺序,往上共计 b 个汉犇犇(算上编起始位置一共 b 个),若不够 b 个,则吃到顶结束;

★数据输入
输入第一行为一个正整数 n,代表操作数量。
接下来 n 行操作,如题意;
对于 50%的数据, 1<=n<=1000;
对于 100%的数据, 1<=n<=100000, 0 <= a, b <= 100000
★数据输出
输出自底向上的汉犇犇编号,数字之间用空格隔开,行末无空格,无换行;

输入示例 输出示例
3
1 10
1 10
1 1
1 3 2
输入示例 输出示例
4
1 10
1 10
1 1
2 1 2
2

示例一解释:
(1) 第一个操作,加入汉犇犇 1 放在汉堡包 10 上面,汉堡包 10 不存在,所以直
接放最上{ 1 }
(2) 第二个操作,加入汉犇犇 2 放在汉犇犇 10 上面,汉犇犇 10 不存在,所以
直接放最上{ 1, 2}
(3) 第三个操作,加入汉犇犇 3 放在汉犇犇 1 上面,汉犇犇 1 存在,所以放 1
上{ 1, 3, 2}

示例二解释:
(1) 前面部分操作和示例一一样,为 {1, 3, 2};
(2) 接着汉堡包吃掉汉犇犇 1 是的 2 个汉犇犇,所以{1, 3}被吃掉
(3) 故输出 2

解题思路

  双向链表+数组存对应节点的地址

code(未验证)

 #include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#include <string.h> #define MAXN 100002 struct Node
{
Node(int _data)
:data(_data),bef(NULL),next(NULL){}
int data;
Node *bef;//before
Node *next;
}; Node *addr[MAXN] = {};
Node *head = NULL, *tail = NULL; void Init();
void Insert(int &prenum,int &thisnum);
void Eat(int &start,int &num);
void DisAll(); int main()
{
Init();
DisAll(); return ;
} void Init()
{
int i=,j=;
int opnum=,op=,hbbnum=;
int a=,b=; scanf("%d",&opnum);
head = new Node(-);
tail = head; for(i=;i<=opnum;i++)
{
scanf("%d",&op);
if(op==)
{
scanf("%d",&a);
Insert(a,hbbnum);
++hbbnum;
}
else//op==2
{
scanf("%d %d",&a,&b);
Eat(a,b);
}
// DisAll();
}
} void Insert(int &prenum,int &thisnum)
{
Node *pnew = new Node(thisnum);
if(addr[prenum] && addr[prenum]->next)//要找的数存在 且 不是最后一个
{
addr[thisnum] = pnew;
pnew->next = addr[prenum]->next;
addr[prenum]->next->bef = pnew;
pnew->bef = addr[prenum];
addr[prenum]->next = pnew;
}
else//数不存在 或 数是最后一个
{
addr[thisnum] = pnew;
pnew->bef = tail;
tail->next = pnew;
tail = pnew;
}
} void Eat(int &start,int &num)
{
int i;
Node *p;
if(addr[start]==NULL)//要找的数不存在,从头开始删
{
for(i=, p=head->next; p && i<=num; i++, p=p->next)
{
addr[p->data] = NULL;
}
head->next = p;
if(p==NULL) tail = head;
else p->bef = head;
}
else//找的数存在,获取地址,开始删
{
Node *pl = addr[start]->bef;
for(i=, p=addr[start]; p && i<=num; i++, p=p->next)
{
addr[p->data] = NULL;
}
pl->next = p;
if(p==NULL) tail = pl;
else p->bef = pl;
}
} void DisAll()
{
for(Node *p = head->next; p; p=p->next)
{
if(p==head->next)
printf("%d",p->data);
else
printf(" %d",p->data);
}
}

数据结构 hbb(汉堡包)的更多相关文章

  1. 3D特征:关于HFM和HBB

    1.HBB    三维绑定框 (1): 要用到HBB,定义还不太清楚,来自于 VALVE Developer Community (https://developer.valvesoftware.co ...

  2. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  3. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  4. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  5. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  6. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  7. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  8. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  9. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

随机推荐

  1. mysql索引攻略

    本设计和优化专题转自博客园的Mysql的设计和优化专题 Explain优化查询检测 所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后 ...

  2. js 科学计数转数字或字符串

  3. bzoj 1951 [Sdoi2010]古代猪文 ——数学综合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 数学综合题. 费马小定理得指数可以%999911658,又发现这个数可以质因数分解.所 ...

  4. flask之python3 虚拟环境及使用dotnv来永久保存环境变量

    Python 3 comes bundled with the venv module to create virtual environments Create an environment Cre ...

  5. 如何修改MAC自带的PHP的版本?

    1. 切换到root目录,新建“.profile”文件 cd ~ vim .profile 2.在.profile文件中添加PATH环境变量 比如这样的路径 export PATH=/Applicat ...

  6. Day2-VIM(三):删除

    字符删除 x 删除光标所在处字符 X 删除光标所在前字符 这里没有什么可注意的地方,但需要说明一下的是 通常情况下,新手一旦着急便会按着x不动,从而达到删除一大块文本的目的 如果是头几天使用还好说,但 ...

  7. CAD库中列举所有航路点

    select distinct f1.airway_point_name,f1.latitude,f1.longitude,upper(f1.airway_point_type_name)type,f ...

  8. vi,sed,tr,awk技巧

    将文件中的换行替换为逗号 使用sed: sed -e :a -e N -e '$!ba' -e 's/\n/,/g' filename 使用tr: cat filename | tr '\n' ',' ...

  9. 为什么在进行Full GC之前最好进行一次Minor GC

    摘自:<Java Performance>第三章 为什么在进行Full GC之前最好进行一次Minor GC? Garbage collecting the young generatio ...

  10. LNMP 1.4 nginx启动脚本和配置文件

    编写Nginx启动脚本,写入下面这段,授权755 vim /etc/init.d/nginx #!/bin/bash # chkconfig: - # description: http servic ...