HDU 1387 Team Queue( 单向链表 )

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了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <algorithm>
using namespace std;
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define lr rt<<1
#define rr rt<<1|1
typedef long long LL;
typedef pair<int,int>pii;
#define X first
#define Y second
const int oo = 1e9+7;
const double PI = acos(-1.0);
const double eps = 1e-6 ;
const int N = 1000010 ;
const int mod = 1007;
int t , n , head , tail ;
int num[N] , nxt[N] , team_last[N] , belong[N];

void Init() {
    memset( nxt , -1 ,sizeof nxt );
    memset( team_last , -1 ,sizeof team_last );
    memset( belong , -1 ,sizeof belong );
    head = tail = -1 ;
}

void Push1( int x ) {
    if( head == -1 ) {
        head = tail = x ;
        nxt[x] = -1 ;
    }
    else {
        nxt[tail] = x ;
        nxt[x] =-1 ;
        tail = x ;
    }
}
void Push2( int x , int last , int team ) {
    nxt[x] = nxt[last];
    nxt[last] = x ;
    team_last[team] = x ;
    if( nxt[x] == -1 ) tail = x ;
}
void Run() {
    Init(); int x ;
    for( int i = 1 ; i <= t ; ++i ) {
        cin >> n ;
        for( int j = 0 ; j < n ; ++j ){
            cin >> x ; belong[x] = i ;
        }
    }
    string s ;
    while( cin >> s ) {
        if( s[0] == ‘S‘ ) break ;
        else if( s[0] == ‘E‘ ) {
            cin >> x ;
            if( belong[x] == -1 ) Push1(x);
            else {
                if( team_last[belong[x]] == -1 ) Push1(x) , team_last[belong[x]] = x ;
                else Push2(x,team_last[belong[x]],belong[x]);
            }
        }
        else {
            cout << head << endl ;
            if( team_last[belong[head]] == head ) team_last[belong[head]] = -1 ;
            head = nxt[head] ;
        }
    }
}
int main()
{
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif // LOCAL
    ios::sync_with_stdio(false);
    int _  , cas = 1 ; //cin >> _ ;
    while( cin >> t && t ) {
        cout << "Scenario #" << cas++ << endl ;
        Run(); cout << endl ;
    }
}

时间: 2024-10-12 11:12:25

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

hdu 1387 Team Queue (链表)

题目大意: 不同的人在不同的队伍里,插入链表的时候假设这个链表里有他的队友,就把它放到最后一个队友的最后.假设没有队友,就把它放到整个链表的最后面. 出链表的时候把第一个人拿出来. 思路分析: 要模拟这个链表就要记录这整个链表中的队伍存在的情况. 所以要再开一个链表的头指针和尾指针,在整个大的链表中再模拟小区域的链表. 然后就是deque部分,也就是注意head的推断以及更新. #include <cstdio> #include <iostream> #include <a

HDU 1387 Team Queue

Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1889    Accepted Submission(s): 639 Problem Description Queues and Priority Queues are data structures which are known to most computer

HDU 1387 Team Queue(优先队列)

Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1524    Accepted Submission(s): 515 Problem Description Queues and Priority Queues are data structures which are known to most compute

Team Queue(STL练习题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1387 Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1518    Accepted Submission(s): 511 Problem Description Queues and Priority Queues

hdu 1387(Team Queue) STL

Team Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2051    Accepted Submission(s): 713 Problem Description Queues and Priority Queues are data structures which are known to most computer

数据结构与算法-单向链表

概述 由于最近在工作中需要用到树形结构来解决一些问题,所以萌生了系统学习“数据结构和算法”的想法,于是乎从最简单的表结构开始.由于数组是最简单的表结构的实现,也是各个编程语言内置的数据类型,所以不做更多的记录.表结构中以下实现打算学习: LinkedList Stack Queue HashTable Dictionary 本篇为学习数据结构的第一篇随笔,从最简单的单向链表开始吧. 实现(C#) 平台:dotNet Core 1.0, C# IDE:VSCode 如果考虑算法复用的话,可以实现泛

HDU 1908 Double Queue&lt;Set&gt;

Problem Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest, equipped with a modern computing environment provided by IBM Romania, and using modern information technologies. As usual, each client of th

数据结构与算法学习-单向链表的实现

链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点.而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的. 节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的.也就是说,节点拥有两个成员:储存的对象.对下一个节点的引用. 这样说可能大家不是很明白,我贴一张图大家可能更容易理解. package LinkedList; /** * <p><strong>

算法总结之 反转部分单向链表

给定单链表的表头节点head, 以及两个整数from 和 to, 在单向链表上把fro个节点到第to个节点这一部分进行反转 思路: 本题 有可能存在换头的问题,所以函数应该返回调整后的新的头节点 1 判断是否满足 1<=from<=to<=N 如果不满足,直接返回原来的头节点 2 找到第from-1个节点pre和第to+1个节点tPos,fPre即要反转部分的前一个节点,tPos是反转部分的后一个节点,把反转部分先反转,然后正确的链接fPre和tPos package TT; impor