//list以链表形式实现,相当于双向链表
#include<iostream>
#include<cstdio>
#include<cstring>
#include<list>
#include<string>
#include<algorithm>
using namespace std;
int t,data,post;//data表示入队元素,post表示元素所在队伍编号
int team[1005][1005];
char command[10];
list<int>m_list;
list<int>::iterator last[1005];//1005迭代器(指针)数组
int ele[1000000];//用来来映射元素属于哪个队伍,下标对应元素值
//查找这个数在哪个队伍
int SearchTeam(int num)
{
int i;
for(i=0;i<t;++i)
{
if(binary_search(team[i]+1,team[i]+1+team[i][0],num))
return i;
}
}
void Input()
{
int i,j;
for(i=0;i<t;++i)
{
scanf("%d",&team[i][0]);//输入第i支团队元素个数
for(j=1;j<=team[i][0];j++)
{
scanf("%d",&team[i][j]);
ele[team[i][j]]=i;//输入的元素均属于第i支团队
}
last[i]=m_list.end();//last[0]=last[1],所有队伍尾指针指向同一个地址,即表尾
//进行排序,为二分做准备
sort(team[i]+1,team[i]+1+team[i][0]);
}
}
void Enqueue(int num)
{
post=SearchTeam(num);
//用下面这种方法获得队伍速度更加快
//post=ele[num];O(1)
if(last[post]==m_list.end())
last[post]=m_list.insert(last[post],num);
else
{
last[post]++;
last[post]=m_list.insert(last[post],num);
}
}//在m_list.end()中插入,效果和push_back一样
void Dequeue()
{
if(m_list.empty())
return;
printf("%d\n",m_list.front());
//如果弹出的那个元素是队列中剩下的队伍中的最后一个,要相应的修改
for(int i=0;i<t;++i)
{//m_list.begin()在弹栈的时候会向表尾移动,当移到表尾时
if(m_list.begin()==last[i])
{
last[i]=m_list.end();//表尾地址一直不变
break;
}
}
m_list.pop_front();//每弹出一个元素表头地址变化一次,最后m_list.begin()=m_list.end()
}
void Solve()
{
if(!m_list.empty())
m_list.clear();
while(~scanf("%s",command))
{
if(!strcmp(command,"STOP"))
break;
if(!strcmp(command,"ENQUEUE"))
{
scanf("%d",&data);
Enqueue(data);
}
else if(!strcmp(command,"DEQUEUE"))
Dequeue();
}
}
int main()
{
//freopen("input.txt","r",stdin);
int cas=1;
while(~scanf("%d",&t)&&t)
{
Input();
printf("Scenario #%d\n",cas++);
Solve();
}
return 0;
}
540-团体队列
最新推荐文章于 2023-02-26 16:46:48 发布