数据结构 hbb(汉堡包)
数据结构 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(汉堡包)的更多相关文章
- 3D特征:关于HFM和HBB
1.HBB 三维绑定框 (1): 要用到HBB,定义还不太清楚,来自于 VALVE Developer Community (https://developer.valvesoftware.co ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- 算法与数据结构(八) AOV网的关键路径
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
随机推荐
- ICE的连接机制
1.当使用ICE的proxy进行方法调用时,ICE运行环境会建立一个到服务器的连接.当proxy提供了多个endpoint时 默认的ICE运行环境选择endpoint的行为为random,可以通过 ...
- 51nod1680 区间求和
有n个数,给定一个k,求所有长度大于等于k的区间中前k大数的总和.这样就比较简单相信大家都会,所以此题要求当k=1~n的总和,即求 ∑nk=1∑n−k+1i=1∑nj=i+k−1 区间前K大和 In ...
- 推荐几本学习MySQL的好书
转载:http://mingxinglai.com/cn/2015/12/material-of-mysql/ 我这里推荐几本MySQL的好书,应该能够有效避免学习MySQL的弯路,并且达到一个不错的 ...
- java代码。继承。。。很戳我的心啊。。不太懂。super的真正用法
总结: package com.addd; //构造方法不能被继承,只能是调用 //属性不能被继承,方法可以 //关于继承练习啊 class fjdsk { String name; int age; ...
- Spring中的线程池ThreadPoolTaskExecutor介绍
前言: Java SE 5.0引入了ThreadPoolExecutor.ScheduledThreadPoolExecutor.Spring 2.x借助ConcurrentTaskExecutor和 ...
- CodeForces - 510B Fox And Two Dots (bfs或dfs)
B. Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 侯捷STL学习(12)--STL相关内容hash+tuple
layout: post title: 侯捷STL学习(12) date: 2017-08-01 tag: 侯捷STL --- 第四讲 STL相关的内容 Hash Function 将hash函数封装 ...
- RabbitMQ 消息队列 应用
安装参考 详细介绍 学习参考 RabbitMQ 消息队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. M ...
- Windows 常见进程
alg.exe描述: alg.exe是Windows系统的一个重要进程,它的功能是用来处理 Internet 连接共享及防火墙,最好不要结束这个进程.taskmgr.exe描述: Windowsxp ...
- vue-cli脚手架build目录中的dev-server.js配置文件
本文系统讲解vue-cli脚手架build目录中的dev-server.js配置文件 这个配置文件是命令npm run dev 和 npm run start 的入口配置文件,主要用于开发环境 由于这 ...