Team Queue

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1294    Accepted Submission(s): 442

Problem Description
Queues and Priority Queues are data structures which are known to most computer scientists. The Team Queue, however, is not so well known, though it occurs often in everyday life. At lunch time the queue in front of the Mensa is a team queue, for example. 
In a team queue each element belongs to a team. If an element enters the queue, it first searches the queue from head to tail to check if some of its teammates (elements of the same team) are already in the queue. If yes, it enters the queue right behind them. If not, it enters the queue at the tail and becomes the new last element (bad luck). Dequeuing is done like in normal queues: elements are processed from head to tail in the order they appear in the team queue.

Your task is to write a program that simulates such a team queue.

 
Input
The input will contain one or more test cases. Each test case begins with the number of teams t (1<=t<=1000). Then t team descriptions follow, each one consisting of the number of elements belonging to the team and the elements themselves. Elements are integers in the range 0 - 999999. A team may consist of up to 1000 elements.

Finally, a list of commands follows. There are three different kinds of commands:

ENQUEUE x - enter element x into the team queue 
DEQUEUE - process the first element and remove it from the queue 
STOP - end of test case 
The input will be terminated by a value of 0 for t.

 
Output
For each test case, first print a line saying "Scenario #k", where k is the number of the test case. Then, for each DEQUEUE command, print the element which is dequeued on a single line. Print a blank line after each test case, even after the last one. 
 
Sample Input
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5 259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005 260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE 259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE 260002
ENQUEUE 260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
 
Sample Output
Scenario #1
101
102
103
201
202
203
 
Scenario #2
259001
259002
259003
259004
259005
260001
 
 
以为要在过程中插入数字,若然是用数组来模拟的话必然超时 O( n = 1000*1000 ) 一次操作。
带插入,直接用一个单向链表即可。
记录 0 ~ 999999 所属的组 。
记录任意组在队列中最后一个元素 。 没有的话用-1表示
入出队时记得完整地更新好这几个数组就ok了。
 
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <cmath>
  6. #include <vector>
  7. #include <queue>
  8. #include <map>
  9. #include <set>
  10. #include <stack>
  11. #include <algorithm>
  12. using namespace std;
  13. #define root 1,n,1
  14. #define lson l,mid,rt<<1
  15. #define rson mid+1,r,rt<<1|1
  16. #define lr rt<<1
  17. #define rr rt<<1|1
  18. typedef long long LL;
  19. typedef pair<int,int>pii;
  20. #define X first
  21. #define Y second
  22. const int oo = 1e9+;
  23. const double PI = acos(-1.0);
  24. const double eps = 1e- ;
  25. const int N = ;
  26. const int mod = ;
  27. int t , n , head , tail ;
  28. int num[N] , nxt[N] , team_last[N] , belong[N];
  29.  
  30. void Init() {
  31. memset( nxt , - ,sizeof nxt );
  32. memset( team_last , - ,sizeof team_last );
  33. memset( belong , - ,sizeof belong );
  34. head = tail = - ;
  35. }
  36.  
  37. void Push1( int x ) {
  38. if( head == - ) {
  39. head = tail = x ;
  40. nxt[x] = - ;
  41. }
  42. else {
  43. nxt[tail] = x ;
  44. nxt[x] =- ;
  45. tail = x ;
  46. }
  47. }
  48. void Push2( int x , int last , int team ) {
  49. nxt[x] = nxt[last];
  50. nxt[last] = x ;
  51. team_last[team] = x ;
  52. if( nxt[x] == - ) tail = x ;
  53. }
  54. void Run() {
  55. Init(); int x ;
  56. for( int i = ; i <= t ; ++i ) {
  57. cin >> n ;
  58. for( int j = ; j < n ; ++j ){
  59. cin >> x ; belong[x] = i ;
  60. }
  61. }
  62. string s ;
  63. while( cin >> s ) {
  64. if( s[] == 'S' ) break ;
  65. else if( s[] == 'E' ) {
  66. cin >> x ;
  67. if( belong[x] == - ) Push1(x);
  68. else {
  69. if( team_last[belong[x]] == - ) Push1(x) , team_last[belong[x]] = x ;
  70. else Push2(x,team_last[belong[x]],belong[x]);
  71. }
  72. }
  73. else {
  74. cout << head << endl ;
  75. if( team_last[belong[head]] == head ) team_last[belong[head]] = - ;
  76. head = nxt[head] ;
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. #ifdef LOCAL
  83. freopen("in.txt","r",stdin);
  84. #endif // LOCAL
  85. ios::sync_with_stdio(false);
  86. int _ , cas = ; //cin >> _ ;
  87. while( cin >> t && t ) {
  88. cout << "Scenario #" << cas++ << endl ;
  89. Run(); cout << endl ;
  90. }
  91. }

HDU 1387 Team Queue( 单向链表 )的更多相关文章

  1. hdu 1387 Team Queue (链表)

    题目大意: 不同的人在不同的队伍里,插入链表的时候假设这个链表里有他的队友,就把它放到最后一个队友的最后.假设没有队友,就把它放到整个链表的最后面. 出链表的时候把第一个人拿出来. 思路分析: 要模拟 ...

  2. HDU 1387 Team Queue

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. Team Queue(STL练习题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1387 Team Queue Time Limit: 2000/1000 MS (Java/Others ...

  4. hdu 1387(Team Queue) STL

    Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. Team Queue (HDU:1387)

    Queues and Priority Queues are data structures which are known to most computer scientists. The Team ...

  6. 利用 C++ 单向链表实现队列

    利用C++ 单向链表实现数据结构队列,其实和上一篇基本内容相同,仅仅是插入的时候在链表的尾部插入,取元素都是一样的,都从头部取. #pragma once #include "stdio.h ...

  7. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  8. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  9. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

随机推荐

  1. JVM(7)之 从GC日志分析堆内存

    开发十年,就只剩下这套架构体系了! >>>   在前面的文章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和 ...

  2. RestController和Controller的区别

    知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用. 1) 如果只是使用@RestController注解Controller,则Co ...

  3. JavaScript中的柯里化

    转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...

  4. JavaScript深入之类数组对象与arguments(转载)

    类数组对象 所谓的类数组对象: 拥有一个 length 属性和若干索引属性的对象 举个例子: var array = ['name', 'age', 'sex']; var arrayLike = { ...

  5. 本机ip地址怎么查

     转自:https://www.192ly.com/basic/local-ip-address-lookup-method.html 百度搜索一下[IP],你就可以轻松看到你的IP地址了,百度出来的 ...

  6. 从__name__=='__main__'说到__builtin__

    一.__name__ 我们在写好代码进行自测的时候一般会先写这样一行代码: # inter_method if __name__ == '__main__': 为什么呢,可能并不是所有人都考虑过,这个 ...

  7. python数字图像处理(五) 图像的退化和复原

    import cv2 import numpy as np import matplotlib.pyplot as plt import scipy import scipy.stats %matpl ...

  8. Nginx1.6.0+MySQL5.6.19+PHP5.5.14(centos)

    一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop fi ...

  9. hdu 5868:Different Circle Permutation 【Polya计数】

    似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...

  10. 《DNS稳定保障系列3--快如闪电,域名解析秒级生效》

    在刚刚过去的双十一,又是一个全民狂欢的盛宴,天猫双十一的成交量高达2684亿.无数小伙伴在淘宝.天猫里买买买,今年你又剁手了多少?言归正传,在你疯狂秒杀的时候,有没有发现,今年的购物体验一如既往的好, ...