数据结构 queue
问题描述
t 个团队在餐厅前准备排队。 他们的排队规则是:
初始队伍为空。一个人要排进队伍前, 先搜索队伍中是否有他的队友。 如果
有, 这名成员就直接站在最后一个队友的后面,如果没有,那么这名成员只能排
在整个队伍的最后面。排队中途,队首的人可能被要求离开队伍。
依照上述排队规则,给出一些操作,操作有以下两种:
(1) IN x , – 编号为 x 的成员进入队伍;
(2) OUT , – 队首成员离开队伍。
操作结束后按顺序输出所有离开成员的编号。
★数据输入
输入第一行为一个正整数 t,代表团队的数量(1<=t<=1000)。
接下来 t 行,每行第一个整数为该团队的人数 n(1<=n<=1000), 接着 n 个整
数代表 n 个成员的编号 id, id 唯一且 1<=id<=1000000。
接下来 q 行操作(1<=q<=200000),注意可能出现已经在队列中的人重复入队
的情况,忽略这样的操作。
★数据输出
输出第一行为整数 m,离开队伍的成员的数量。
接下来 m 行按序输出离开的成员的 id。
| 输入示例 | 输出示例 |
| 2 3 101 102 105 3 103 104 106 12 IN 101 IN 103 IN 104 IN 102 IN 105 IN 106 OUT OUT OUT OUT OUT OUT |
6 101 102 105 103 104 106 |
| 输入示例 | 输出示例 |
| 2 5 2501 2502 2503 2504 2505 6 26001 26002 26003 26004 26005 26006 14 IN 2501 IN 26001 IN 2502 IN 2503 IN 2504 IN 2505 OUT OUT IN 2602 IN 2603 OUT OUT OUT OUT |
6 2501 2502 2503 2504 2505 26001 |
思路
定义一个存team的队列qq,其中,每个元素team是一个队列。也就是说,定义一个存队列的队列。
但是由于qq要支持随机访问,故用数组模拟队列。qq中的每个元素team用std::queue或者数组模拟都可以。
由于操作数较多(1<=q<=200000) ,若每次操作依据id查找所属team,再查找team再queue中的位置会消耗较多时间,
所以用数组teamid存对应id所属的team编号(从1开始),用数组teamindex存对应team在qq中的index
有新人入队时,先检测他所属的team,若在qq中找到,则push在team末尾;若找不到,则在qq中新加一个team,把这个id加入这个team
出队时,对qq中的第1个team实行pop操作,再判断该team是否为空,若为空,对qq pop该team
code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#include <queue> #define MAXID 1000003
#define MAXTEAM 1003
#define MAXOP 200003 int teamid[MAXID] = {};//teamid[id]
bool inque[MAXID] = {}; //inque[id]
int teamindex[MAXTEAM] = {};//teamindex[teamid[id]] queue<int> ans;
queue<int> qq[MAXOP]; int main()
{
int i,j,u;
int t,id,op;
char str[]={};
scanf("%d",&t);
for(i=;i<=t;i++)
{
scanf("%d",&u);
for(j=;j<=u;j++)
{
scanf("%d",&id);
teamid[id] = i;
}
} int l=,r=;
scanf("%d",&op);
getchar();
for(i=;i<=op;i++)
{
scanf("%s",str);
if(strcmp(str,"IN")==)
{
scanf("%d",&id);
getchar();
if(inque[id]==false)
{
inque[id] = true;
if(teamindex[teamid[id]]==)
{
++r;
qq[r].push(id);
teamindex[teamid[id]] = r;
}
else
{
qq[teamindex[teamid[id]]].push(id);
}
}
}
else if(strcmp(str,"OUT")==)
{
if(l<=r)
{
inque[qq[l].front()] = false;
ans.push(qq[l].front());
int tmp = qq[l].front();
qq[l].pop();
if(qq[l].empty())
{
teamindex[teamid[tmp]] = ;
++l;
}
}
}
} printf("%d\n",ans.size());
while(!ans.empty())
{
printf("%d\n",ans.front());
ans.pop();
} return ;
}
之前贴的代码有bug (新代码已修正):
(1)在OUT操作时应判断 (l<=r);
(2)qq数组定义过小,重新定义为 queue<int> qq[MAXOP];,其中 MAXOP = 200003
注意,qq数组最好在全局定义,不然OJ上会SO
数据结构 queue的更多相关文章
- linkin大话数据结构--Queue
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...
- 天方夜谈·数据结构·Queue
"我在想Y的时候不能想X....." 什么叫做Queue(队列)?"队列是项的集合,对于每一项x和y,如果x在y之前离开对头,那么x一定在y之前进入队列--Sesh·Ve ...
- [Java数据结构]Queue
Queue扩展了Collection,它添加了支持根据先进先出FIFO原则对元素排序的方法. 当对Queue调用add和offer方法时,元素始终添加在Queue的末尾:要检索一个元素,就要使用一个元 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- hdu 1972.Printer Queue 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1972 题目意思:需要模拟打印机打印.打印机里面有一些 job,每个job被赋予1-9的其中一个值,越大 ...
- SPL标准库常用的数据结构
栈数据结构 $stack = new SplStack(); //栈数据结构->先进后出 2 $stack->push('data1'); //入栈 $stack->push('da ...
- 数据结构算法集---C++语言实现
//数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...
- java队列——queue详细分析
Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. Q ...
- C++ queue deque
queue queue 队,一种先进先出的数据结构,c++ stl里也叫容器适配器,它是以deque 或list为基础的一种数据结构 queue的相关操作 queue<int deque< ...
随机推荐
- Python之用虚拟环境隔离项目,并重建依赖关系
下面将以安装django和mysqlclient介绍如何用虚拟环境隔离项目,并重建依赖关系.操作系统:windows 10:python版本:python3.7 1. 安装python虚拟环境 (1) ...
- centos安装教程
centos7和6.x有很大的差别,在第一次安装的时候遇到了很多坑,一共安装了三次才成功 如果是用window自带的Hyper-v装centos时 安装包在\\10.10.10.1\ShareDo ...
- Android UI--提高Android UI体验
1,自定义虚拟键盘 当一个用户被要求在一个文本框输入时希望又怎样的体验? 从用户需求来看,虚拟键盘应该改变以帮助用户输入的数据.这里是一些例子: 如果一个视图是一个电子邮件地址,一个键盘的“@”符号 ...
- python数据类型,int,str,bool
一,python中的int() int在python中主要用来运算,对字符串的转化,用int(str)表示,并且需要str.isdigit为真. 在int()中二进制的转换如下: #bit_lengt ...
- win32 获取本机网卡信息(MAC地址,IP地址等)
由于一个需求需要获取网卡的MAC地址,就搜了一下,大部分都是COPY来COPY去的一些代码,有很多甚至不能直接运行或有还有内存泄漏.自己查了一下MSDN然后封装了一下: 需要注意,一个机器可能有多个网 ...
- MySQL 查询数据表里面时间字段为今天添加的计数
一: 下面这条语句查出来的count值 . 查询类型ID(category_id)为18的,今天插入的数据数, created_on: 为数据表中一字段 datetime类型, 记录此条数据添加的时 ...
- Java-API-Package:org.springframework.beans.factory.annotation
ylbtech-Java-API-Package:org.springframework.beans.factory.annotation 1.返回顶部 1. @NonNullApi @NonNull ...
- AngularJS:实例
ylbtech-AngularJS:实例 1.返回顶部 1. AngularJS 实例 实例 您可以在线编辑实例,然后点击按钮查看结果. AngularJS 实例 <div ng-app=&qu ...
- __thiscalll C++底层识别成员函数
问题描述: class myClass { public: void SetNumber(int nNumber) { m_nInt = nNumber; } private: int m_nInt; ...
- 生产者与消费者--demo1---bai
import java.util.ArrayList; import java.util.List; import java.util.Random; //自定义类,描述仓库 public class ...